Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 通过检查WCF中传入的JSON进行动态类型选择?_.net_Wcf_Web Services_Json_Serialization - Fatal编程技术网

.net 通过检查WCF中传入的JSON进行动态类型选择?

.net 通过检查WCF中传入的JSON进行动态类型选择?,.net,wcf,web-services,json,serialization,.net,Wcf,Web Services,Json,Serialization,我拥有发布到WCF服务的JSON对象的复杂继承权。根据设计和其他要求,每个JSON对象都有一个整数id,从概念上表示其类型或字段布局——我们称之为类型id 我想要完成的是,通过检查每个传入的整数类型id,控制为每个JSON对象的反序列化选择哪个.NET类型 输入示例: { "typeId": 4, "someField1": "foo", "someField2": "bar", "otherObject": { "typeId": 7 "someField

我拥有发布到WCF服务的JSON对象的复杂继承权。根据设计和其他要求,每个JSON对象都有一个整数id,从概念上表示其类型或字段布局——我们称之为类型id

我想要完成的是,通过检查每个传入的整数类型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,我想,但我不记得它的确切用途,也不记得是否可以在WCF中启用它作为替代方案。

如果需要具体类型,您可以将传入的JSON收集为字符串,或者如果您处于基于REST的场景中,您可以将JSON作为非常有用的流,然后将其复制到MemoryStream中进行多次处理结束由于DataContractJsonSerializer在流外工作,因此最好的用例是将其转储到MemoryStream中

您正在描述的反序列化用例将很难实现,因为如果案例otherObject中的嵌套对象不是父类的成员(在本例中为FooBarA),那么反序列化过程将忽略该值,因为它无处放置该值

切换设备,一个更耗时的过程将使用Json.Net,您可以使用与Linq to XML类似的样式逐步处理Json。Net的优点是,它允许您使用不一定完全映射到具体类的Json。它在序列化链中不能很好地与WCF配合使用,但我在WCF端使用过几次它来处理提供的JSON,这些JSON与具体类所要查找的内容不完全匹配


您可以在这里找到Json.Net-

在我的例子中,如果嵌套对象可能是父对象的一部分,则父目标类型将始终具有相应的强类型字段。在这种情况下,该类应该使用父类型的默认DataContractJsonSerializer正确反序列化,而无需您执行任何操作。似乎不需要。我认为,因为字段是作为基类键入的。我需要能够检查类型id,以了解用于反序列化的派生类。无论如何,我已经用Json.NET和一个JsonConverter解决了这个问题。谢谢