【问题标题】:How to deal with JSON and variant objects?如何处理 JSON 和变体对象?
【发布时间】:2011-04-08 17:22:55
【问题描述】:

我正在使用 .NET 的 JavascriptSerializer 将 JSON 反序列化为运行时对象,并且在大多数情况下,JSON 字段和对象字段之间的映射是自动的。但是,我面临以下情况,并欢迎就如何处理它提出建议。

假设我们有一个 Shape 的 JSON 表示,它可以是 Square 或 Circle。例如,

{"ShapeType":"Circle","Shape":{"Color":"Blue", "Radius":"5.3"}}

{"ShapeType":"Square","Shape":{"Color":"Red", "Side":"2.1"}}

这些 JSON 字符串按照如下所示的类层次结构建模。

class ShapePacket
{
    public string ShapeType;  // either "Square" or "Circle"
    public Shape Shape;
}

class Shape   // all Shapes have a Color
{
    public string Color;
}

class Square : Shape
{
    public float Side;
}

class Circle : Shape
{
    public float Radius;
}

在这种涉及变体类型的情况下,仅调用 JavascriptSerializer.Deserialize 不起作用。尽管我的数据类型中有“分支”,有什么方法可以哄 JavascriptSerializer 反序列化?我也对第三方解决方案持开放态度。

【问题讨论】:

标签: c# .net json javascriptserializer


【解决方案1】:

您的数据类型中的分支可能需要您的代码中的分支。我不相信除了显式方式之外还有其他方法可以做到这一点。

我会分两步完成:

首先,使用 JsonConvert.DeserializeObject 将传入的 JSON 对象转换为无类型哈希

然后,在“ShapeType”字段上手动分支以选择适当的Shape 类(SquareCircle),并自己构造一个实例。

(此处为后代提供了明确的解决方案,尽管我怀疑您不需要我的帮助;)

【讨论】:

    【解决方案2】:

    我认为您需要使用这样的 JavaScriptTypeResolver 实现来初始化 JavascriptSerializer(SimpleTypeResolver 内置在类库中):

    new JavaScriptSerializer(new SimpleTypeResolver());
    

    为了启用自动类型解析。我认为因此它会在输出 JSON 中添加一个 __type 字段,稍后它将用于解析回类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 2015-09-13
      • 2015-12-23
      • 2017-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多