我正在使用.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
尽管我的数据类型中的“分支”反序列化?我也对第三方解决方案持开放态度。
答案 0 :(得分:2)
数据类型中的分支可能需要在代码中使用分支。除了明确的方式,我不相信有办法做到这一点。
我会分两步执行此操作:
首先,使用JsonConvert.DeserializeObject
然后,手动分支'ShapeType'字段以选择适当的Shape
类(Square
或Circle
),并自行构建实例。
(这里为后人包含了明确的解决方案,虽然我怀疑你不需要我的帮助;)
答案 1 :(得分:1)
我认为你需要使用像这样的JavaScriptTypeResolver实现来初始化JavascriptSerializer(SimpleTypeResolver内置在类库中):
new JavaScriptSerializer(new SimpleTypeResolver());
以启用自动类型解析。我认为因此它会在输出JSON中添加一个__type字段,稍后它将用于解析该类型。