c# - 如何将名称-值对数组的 JSON 数组反序列化为 List<MyClass>

标签 c# jquery json.net json-deserialization

我有一个 JSON 字符串,我正在尝试将其反序列化为以下类的列表:

public class Selection
{
    public Int64 id { get; set; }
    public bool view { get; set; }
    public bool edit { get; set; }
    public bool broad { get; set; }
}

这是我得到的 JSON 字符串:

[
    [
        {"name":"id", "value":0},
        {"name":"view", "value":true},
        {"name":"edit", "value":false},
        {"name":"broad", "value":false}
    ],
    [
        {"name":"id", "value":0},
        {"name":"view", "value":false},
        {"name":"edit", "value":false},
        {"name":"broad", "value":false}
    ],
    [
        {"name":"id", "value":0},
        {"name":"view", "value":true},
        {"name":"edit", "value":false},
        {"name":"broad", "value":false}
    ],
    [
        {"name":"id", "value":0},
        {"name":"view", "value":true},
        {"name":"edit", "value":false},
        {"name":"broad", "value":false}
    ],
    [
        {"name":"id", "value":0},
        {"name":"view", "value":false},
        {"name":"edit", "value":false},
        {"name":"broad", "value":false}
    ],
    [
        {"name":"id", "value":0},
        {"name":"view", "value":false},
        {"name":"edit", "value":false},
        {"name":"broad", "value":false}
    ],
    [
        {"name":"id", "value":0},
        {"name":"view", "value":false},
        {"name":"edit", "value":false},
        {"name":"broad", "value":false}
    ],
    [
        {"name":"id", "value":0},
        {"name":"view", "value":false},
        {"name":"edit", "value":false},
        {"name":"broad", "value":false}
    ],
    [
        {"name":"id", "value":0},
        {"name":"view", "value":false},
        {"name":"edit", "value":false},
        {"name":"broad", "value":false}
    ],
    [
        {"name":"id", "value":0},
        {"name":"view", "value":false},
        {"name":"edit", "value":false},
        {"name":"broad", "value":false}
    ]
]

这就是我调用反序列化的方式:

 var selection = JsonConvert.DeserializeObject<List<Selection>>(param.selection);

但是我收到了这个错误:

enter image description here

我需要另一种格式吗?

最佳答案

您收到此错误是因为 JSON 的形状与您尝试反序列化的结构不匹配。您的 JSON 表示一组名称-值对对象数组,但您正试图反序列化为 List<Selection>。 .要反序列化到您定义的类中,您需要使用自定义 JsonConverter像这样:

public class SelectionConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(Selection);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var obj = new JObject(
            JArray.Load(reader)
                  .Children<JObject>()
                  .Select(jo => new JProperty((string)jo["name"], jo["value"]))
            );
        var selection = new Selection();
        serializer.Populate(obj.CreateReader(), selection);
        return selection;
    }

    public override bool CanWrite
    {
        get { return false; }
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

然后,你可以这样反序列化:

var selection = JsonConvert.DeserializeObject<List<Selection>>(param.selection, new SelectionConverter());

fiddle :https://dotnetfiddle.net/pgAvUA

关于c# - 如何将名称-值对数组的 JSON 数组反序列化为 List<MyClass>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41078821/

相关文章:

c# - RestSharp 在 POST 上默认 Content-Type 为 application/x-www-form-urlencoded

c# - 带有可选文本限定符的批量插入

javascript - Node.js,多个计时器在完成时依次显示

javascript - onclick 将 <code> 复制或突出​​显示到剪贴板

c# - 根据 c# 类中的条件变量格式化 json 对象

c# - 如何在 C# 中反序列化嵌套 JSON

c# - 您可以扩展 JSON.NET 中用于集合的默认 JsonConverter 吗?

c# - 无法在 C# 中将行转换为 DataTable

c# - 错误 : Object reference not set to an instance of an object

jquery - 为什么 $ ("div > div") 的工作方式与 $ ("div").children ("div") 不同?