2011-04-28 57 views
0

我有一个复杂的JSON对象张贴到WCF服务的层次结构。按照设计和其他要求,每个JSON对象都有一个整数id,它在概念上表示其类型或字段布局(我们称之为类型id)。通过检查WCF中传入的JSON动态类型选择?

我想完成的是通过检查每个传入的整数类型ID来控制为每个JSON对象的反序列化选择哪种.NET类型。

示例输入:

{ 
"typeId": 4, 
"someField1": "foo", 
"someField2": "bar", 
"otherObject": 
    { 
    "typeId": 7 
    "someField3": "abc", 
    "someField4": "xyz" 
    } 
} 

实施例(理想)工艺:

1. I receive partially parsed object. 
2. I inspect "typeId" which has value 4. 
3. I notify the deserialization process that I elect to use my .NET type FooBarA. 
4. I receive partially parsed object. 
5. I inspect "typeId" which has value 7. 
6. I notify the deserialization process that I elect to use my .NET type FooBarB. 

是这种或类似的可能做什么?我似乎记得asmx风格的服务用于包含类似于我的类型id的__type字段,但我不记得它的确切目的,或者是否可以在WCF中作为替代方法启用它。

回答

0

您可以收集传入的JSON作为字符串(如果您想要“具体”类型),或者您可以接受JSON作为流(如果您处于基于REST的场景中非常有用),然后将其复制放入MemoryStream中进行几次处理。由于DataContractJsonSerializer在Stream之外工作,因此最好的用例是将其转储到MemoryStream中。因为如果嵌套对象(在你的例子中是“otherObject”)不是父类的成员(在这种情况下是FooBarA),那么反序列化就是非常困难的过程只会忽略价值,因为它无处可放。

切换装置,更耗时的过程将使用Json.Net,并且可以按照与使用Linq到XML相似的样式来遍历JSON。 Json.Net的优点是它可以让你玩JSON,并不一定完全映射到具体的类。它在序列化链中与WCF不能很好地发挥作用,但是我已经在WCF端用了几次来处理JSON,它提供的JSON与具体类正在寻找的内容完全不匹配。

你可以在这里找到Json.Net - http://json.codeplex.com/

+0

在我的情况下,如果一个嵌套的对象可能永远是一个父对象的一部分,父目标类型总会有相应的场强类型。 – DuckMaestro 2011-04-30 04:19:03

+0

在这种情况下,该类应该使用父类型的默认DataContractJsonSerializer正确反序列化,而无需执行任何操作。 – thaBadDawg 2011-04-30 21:52:29

+0

似乎没有。我认为该字段是作为基类输入的。我需要能够检查类型ID以知道哪个派生类用于反序列化。无论如何,我已经使用Json.NET重读和JsonConverter制定了一个解决方案。谢谢。 – DuckMaestro 2011-04-30 23:19:08