【问题标题】:How do I deserialize different JSON representations of the same class?如何反序列化同一类的不同 JSON 表示?
【发布时间】:2019-01-29 19:34:10
【问题描述】:

我有一个 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" : &lt;x&gt;, "y" : &lt;y&gt;}

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

但是,Multipoint 的 JSON 语法是

{"points" : [[ &lt;x1&gt;, &lt;y1&gt; ] , [ &lt;x2&gt;, &lt;y2&gt; ], ... ]}

尝试反序列化时出现以下错误:

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

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

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

【问题讨论】:

  • 请附上来自真实 JSON 的 sn-p,它应该被反序列化。这是一种无需任何自定义序列化程序即可反序列化的结构。您可能在真实的 JSON 结构和您的类之间存在不匹配。尝试在此处粘贴您的 JSON:app.quicktype.io/#l=cs&r=json2csharp

标签: c# arrays serialization json.net


【解决方案1】:

可能是Multipoint.Points 属性的自定义ItemConverterType

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

转换器应该实现JsonConverter

【讨论】:

  • 优秀。谢谢你。这种方法对我有用。但是,我不太明白为什么它要反序列化单个 Point,而不是 List.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多