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

How to deserialize a JSON array of arrays of name-value pairs into a List<MyClass>

我有一个 JSON 字符串,我正试图将其反序列化为以下列表 class:

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);

但是我收到这个错误:

我需要另一种格式吗?

这个 JSON 不容易解析,你在 JSON 中将参数的名称作为字典的值。 最好的做法是将 JSON 更改为:

[
{
        id :12345,
        view:true,
        edit : true,
        broad :true
},
.....
]

像这样,它将使用相同的代码进行解析。

如果您不能更改JSON,那么您的代码将不得不使用反射来设置属性。或者解析为字典并循环遍历它,并为每个 属性 将其值设置为新对象。

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

请找到下面的解释序列化j son 字符串。 在我的示例中,我有一个包含学生详细信息的字符串,如下所示。

  string json = @"{""data"":[{""id"":""1"",""name"":""A""}, {""id"":""2"",""name"":""B""}, {""id"":""3"",""name"":""C""}, {""id"":""5"",""name"":""D""}]}";

我正在使用下面的 class 结构,如下所示。

   public class Students
   {
       public List<StudentDetails> data { get; set; }
   }
   public class StudentDetails
   {
       public string id { get; set; }
       public string name { get; set; }



   }

使用下面的代码行序列化 json 字符串

 Students studentdetails = new JavaScriptSerializer().Deserialize<Students>(json);

此处 JavaScriptSerializer() class 出现在 system.Web.Extensions 程序集中。 如果对您有帮助,请标记为答案。