如何将名称-值对数组的 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 程序集中。
如果对您有帮助,请标记为答案。
我有一个 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 程序集中。 如果对您有帮助,请标记为答案。