2011-04-08 134 views
5

我使用.NET的JavascriptSerializer将JSON反序列化为运行时对象,并且大部分情况下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

看起来像这个问题[与多态对象的数组JSON序列化](http://stackoverflow.com/questions/5186973/json-serialization-of-array-with-polymorphic-objects)。 – R0MANARMY 2011-04-08 17:40:42

回答

2

数据类型中的分支可能需要代码中的分支。除了明确的方式外,我不相信有办法做到这一点。

我将分两个步骤来完成此:

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

然后,手动在“ShapeType”田分公司选择合适的ShapeSquareCircle),并自己构建一个实例。

(这里包括为子孙后代明确的解决方案,虽然我怀疑你不需要我与它的帮助;)

1

我认为你需要有JavaScriptTypeResolver实现这样初始化JavascriptSerializer(SimpleTypeResolver建在类库中):

new JavaScriptSerializer(new SimpleTypeResolver()); 

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