我正在使用Newtonsoft.JSON,我有一个JSON数组,其中每个数组成员本身就是一个包含两个数字的数组,例如。
{
"objList": [
[8.8, 4],
[9.2, 1.45],
[1.61, 32.79]
]
}
我想将其反序列化为由
定义的类MyObjListpublic 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]
放在MyObj类上,即
[JsonArrayAttribute]
public class MyObj{
public double FirstDouble{ get; set; }
public double SecondDouble { get; set; }
}
这已经让事情发生了,反序列化器现在在下一个阶段失败,它正在寻找合适的构造函数。但我不知道如何编写所需的构造函数,我找不到任何示例。有人可以告诉我该怎么做吗?
答案 0 :(得分:1)
您拥有的JSON
并不代表您对象MyObjList
。
{
"objList": [
[8.8, 4],
[9.2, 1.45],
[1.61, 32.79]
]
}
您的JSON
基本上是List<List<double>>
。
从这些数据中创建对象的一种简单方法是使用Linq-to-JSON
中的Json.NET
并构建您的对象
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()
};
有关详细信息,请参阅documentation。
答案 1 :(得分:1)
如果您热衷于使用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();
}
}
答案 2 :(得分:0)