[英]Serializing JSON array of 2 doubles to strongly typed object
我正在使用Newtonsoft.JSON,我有一个JSON数组,其中每个数组成员本身就是两个数字的数组,例如
{
"objList": [
[8.8, 4],
[9.2, 1.45],
[1.61, 32.79]
]
}
我想反序列化为由定义的类MyObjList
public class MyObjList {
[DataMember(Name = "objList")]
public List<MyObj> ObjList { get; set; }
}
MyObj是类
public class MyObj {
public double FirstDouble{ get; set; }
public double SecondDouble { get; set; }
}
我知道需要做更多的工作,但是只要[JsonArrayAttribute]
上面的内容,就会给我一个有用的错误消息,告诉我可以将[JsonArrayAttribute]
放在MyObj类上,即
[JsonArrayAttribute]
public class MyObj{
public double FirstDouble{ get; set; }
public double SecondDouble { get; set; }
}
这已经推动了事情发展,反序列化程序现在在寻找合适的构造函数的下一阶段失败。 但是我不知道如何编写所需的构造函数,并且找不到任何示例。 有人可以告诉我该怎么做吗?
您拥有的JSON
并不代表您对象MyObjList
。
{
"objList": [
[8.8, 4],
[9.2, 1.45],
[1.61, 32.79]
]
}
您的JSON
基本上是List<List<double>>
。
一种根据数据创建对象的简单方法是使用Json.NET
Linq-to-JSON
并像这样构造对象
var jsonString = @"{ ""objList"": [ [8.8, 4], [9.2, 1.45], [1.61, 32.79] ] }";
var jObject = JObject.Parse(jsonString);
var myObjList = new MyObjList
{
ObjList = jObject["objList"]
.ToObject<List<List<double>>>()
.Select(list => new MyObj { FirstDouble = list[0], SecondDouble = list[1] })
.ToList()
};
有关更多详细信息,请参见文档 。
如果您热衷于使用MyObj
而不是List<double>
,可以尝试为MyObj
类型创建一个自定义JsonConverter
, 它基本上只是包装整个List<double>
反序列化并将其提供给MyObj
类型 ,如下所示:
[JsonConverter(typeof(MyObjConverter))]
public class MyObj{
public double FirstDouble{ get; set; }
public double SecondDouble { get; set; }
}
public class MyObjConverter : JsonConverter
{
public override bool CanWrite { get { return false; } }
public override bool CanConvert(Type objectType) {
return objectType == typeof(MyObj);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) {
var doubles = serializer.Deserialize<List<double>>(reader);
return new MyObj { FirstDouble = doubles[0], SecondDouble = doubles[1] };
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) {
throw new NotImplementedException();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.