我从json格式的服务接收到一些数据。部分数据是BASE类的对象(比如说)。有许多类从它派生出来: 不使用程序集名称反序列化多态类型,只用Newtonsoft lib
现在服务器发送一个固定的结构json,并且BASE类型的对象位于它中。一些示例响应这里我列出了下来:
"{"Status":"Success","B":{"$type":"B1","id":"123"},"C":null}"
"{"Status":"Success","A":{"$type":"A3","name":"Jon"},"B":{"$type":"B2","id":"A34J"}}"
我在我的客户端模型中定义的类同一层次,我使用NewtonSoft JSON库反序列化的内容。正如你所看到的,服务器发送从BASE类派生的每个对象的$ type信息,我希望能够在客户端反序列化过程中将这些对象加载到它们各自的类型中。我deserliaze的JSON转换成类型响应
class Response
{
string Status;
BASE object1;
BASE object2;
}
Response resp = JsonConvert.DeserializeObject<Response>(jsonServiceMsg, new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto, Binder = mycustombinder });
的目标正如你所看到的,我不指定对象B1或A3或B2的确切类型,在响应对象,我想Newtonsoft LIB给init object1和object2,并在json消息中使用基于$ type值的适当类型。
注意,服务具有这些类(基础和所有derivetives) 在不同的命名空间中定义和我(客户端)在不同 命名空间。但为了简单起见,在序列化为json响应时,通过使用自定义绑定器,服务不会绑定名称空间 。
我知道我可以通过定义一个定制绑定(从SerializationBinder派生类),并重写BindToName和BindToType性质(refer link)
实现这一点,但问题是,我们不希望使用JSON。来自System.Runtime.Serialization的Net SerializationBinder。我们的模块只能使用Newtonsoft lib。任何解决方案?
您可以按照[使用json.net反序列化多态json类的类型](https://stackoverflow.com/questions/19307752)的方式为'Base'创建一个自定义'JsonConverter'。尽管在这种情况下,你确实有类型信息,但你可以在转换器中按照答案的方式手动处理它。 – dbc
我收到的json非常大,两个Base类型的对象只是它的一部分。难道你不认为如果我通过自定义的JsonConverter去编写太多的代码。我也必须序列化它。这不是太多的代码吗? – Rajat
'JsonConverter'将用于'Base'及其抽象子类。你需要做的就是维护一个从类型名到类型的查找字典。 JSON的整体大小是不相关的,其他类的数量无关紧要。当然,编写自己的'SerializationBinder'会更容易,也就是解决这个问题的预期方式 - 但无论出于何种原因你不想这样做。 – dbc