如何反序列化同一类的不同JSON表示形式?

时间:2019-01-29 19:34:10

标签: c# arrays serialization json.net

我有一个C#类,根据上下文,客户端可能用两种不同的JSON模式表示它们。

    public class Point
    {
        [JsonProperty("x")]
        public double? X { get; set; }

        [JsonProperty("y")]
        public double? Y { get; set; }
    }

    public class Multipoint
    {
        [JsonProperty("points")]
        public List<Point> Points { get; set; }
    }

其中Multipoint只是Point的列表。

Point的JSON语法为:

{"x" : <x>, "y" : <y>}

我可以使用Json.NET成功反序列化。

但是,Multipoint的JSON语法是

{"points" : [[ <x1>, <y1> ] , [ <x2>, <y2> ], ... ]}

尝试反序列化时会收到以下错误:

  

无法将当前JSON数组(例如[1,2,3])反序列化为类型'Deserialization.Point',因为该类型需要JSON对象(例如{“ name”:“ value”})才能正确反序列化。   要解决此错误,可以将JSON更改为JSON对象(例如{“ name”:“ value”}),也可以将反序列化类型更改为数组,或者将实现集合接口的类型(例如ICollection,IList)更改为List,例如List从JSON数组反序列化。还可以将JsonArrayAttribute添加到类型中,以强制其从JSON数组反序列化。

是的,是的,因为序列化器不知道如何将内部数组的元素(纵坐标对)分配给X和Y属性。

因此,这可以通过创建一个自定义的序列化器将正确的纵坐标分配给正确的属性来完成。但是,我不明白的是如何为我的类型分配2个不同的序列化器。

1 个答案:

答案 0 :(得分:2)

也许是ItemConverterType属性的自定义Multipoint.Points

public class Multipoint
{
    [JsonProperty(PropertyName = "points", ItemConverterType = typeof(MyPointsConverter))]
    public List<Point> Points { get; set; }
}

转换器应实现JsonConverter