使用Javascriptserializer反序列化为自定义类型
本文关键字:自定义 类型 反序列化 Javascriptserializer 使用 | 更新日期: 2023-09-27 18:18:42
我正在使用JavaScriptSerializer将json反序列化到我制作的类中,但我有一个问题。
我要序列化的json是这种形式。json的格式不在我的控制范围内。
{"list": {
"p1": {
"a": 6,
"b": 7
},
"p2": {
"a": 1,
"b": 1
}
}
我想把它反序列化成这样的类;
public class jsonObject
{
public listType list {get;set;}
internal class listType
{
}
}
和我的反序列化方法;
var engine = new JavaScriptSerializer();
dynamic foo = engine.Deserialize<jsonObject>(json);
我不知道该怎么处理列表里的项目。它不是一个数组,它里面的对象数量可以变化。有时是p1,有时是p7。除了在listType中声明p1,p2,p3,p4,p5,p6,p7之外,还有其他解决方案吗?
您的JSON字符串似乎不正确。试着这样写:
{"list": [
"p1": {
"a": 6,
"b": 7
},
"p2": {
"a": 1,
"b": 1
}]
}
我为列表添加了一个左括号,以便将其标记为对象,并将数组的左括号更改为方括号。
try this
var foo = engine.Deserialize<List<jsonObject>>(json);
好的,我已经找到了一些工作;
我创建了另一个类,命名为childTypepublic childType
{
public int a {get;set;}
public int b {get;set;}
}
然后我声明listType为
public Dictionary<string,childType> list {get;set;}
字典的键是json (p1,p2,p3,p4)中的子对象的名称,值被分配给childType。
您得到的json格式必须正确转义。你可以使用Json。Net像这样解析它。
JObject obj = JObject.Parse(@"
{""list"": {
""p1"": {
""a"": 6,
""b"": 7
},
""p2"": {
""a"": 1,
""b"": 1
}
}}
");
你说你不确定list
内部的属性名称是什么。所以我将使用Children()
方法的一个JProperty
//In case you are not sure if `a` or `b` will also change their name go for this using an anonymous type
var result = obj.Property("list")
.Children()
.Children()
.Children()
.Select(x=> new {a =x.Children().ElementAt(0).ToString(), b = x.Children().ElementAt(1).ToString()});
//In case you are sure about `a` and `b` go for this using an anonymous type
var result = obj.Property("list")
.Children()
.Children()
.Children()
.Select(x=> new {a =x["a"].ToString(), b = x["b"].ToString()});
//In case you need a concrete type to store your data,i am using your class `childType`
public class childType
{
public int a {get;set;}
public int b {get;set;}
}
List<childType> lst = obj.Property("list")
.Children()
.Children()
.Children()
.Select(x=> new childType {a =Convert.ToInt32(x["a"]), b = Convert.ToInt32(x["b"])}).ToList();
我在对JObject
了解有限的情况下想出了这个解决方案。