5

我正在使用 .NETJavascriptSerializer将 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尽管我的数据类型中有“分支”,但有什么方法可以哄骗反序列化?我也对第三方解决方案持开放态度。

4

2 回答 2

2

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

我将分两步执行此操作:

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

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

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

于 2011-04-08T17:32:55.967 回答
1

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

new JavaScriptSerializer(new SimpleTypeResolver());

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

于 2011-04-08T17:36:24.920 回答