繁体   English   中英

将2的JSON数组序列化为强类型对象

[英]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();
  }
}

演示: https : //dotnetfiddle.net/x0FCFX

不知道这是否是将双打映射到这样的实际类的要求。 我认为这样做只会使事情复杂化。 这是使其工作的最简单方法:

MyObjList

public class MyObjList
{
   public List<List<double>> objList { get; set; }
}

在POST中,您将获得以下信息:

POST

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM