将2个双精度的JSON数组序列化为强类型对象

时间:2015-12-16 14:10:20

标签: c# json json.net deserialization

我正在使用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]放在MyObj类上,即

[JsonArrayAttribute]
public class MyObj{
    public double FirstDouble{ get; set; }
    public double SecondDouble { get; set; }
}

这已经让事情发生了,反序列化器现在在下一个阶段失败,它正在寻找合适的构造函数。但我不知道如何编写所需的构造函数,我找不到任何示例。有人可以告诉我该怎么做吗?

3 个答案:

答案 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();
  }
}

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

答案 2 :(得分:0)

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

<强> MyObjList

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

在POST中你会得到这个:

POST