给定 {"$type":"MyType, MyAssembly","seed":0"} 形式的JSON字符串,为什么JsonConvert.DeserializeObject不能使用与"MyType"关联的JsonConverter?

我尝试用 [JsonConverter(typeof(MyType))] 属性装饰MyType类 . 没有't work. The custom JsonConverter'的ReadJson方法永远不会被调用 .

我已经尝试将自定义转换器添加到序列化程序的设置转换器集合中,并确保CanConvert方法对“MyType”返回true,并且CanRead方法返回true . 不行 . 无论是转换器的CanConvert还是其ReadJson方法都没有被调用过 .

DeserializeObject方法需要能够反序列化包含类型在编译时未知的对象的JSON字符串,但其类型通过特殊的"$type"成员嵌入到JSON对象中 . 因此,不建议使用 DeserializeObject<T> 或指出它适用于成员,其类型在 Contract 中已经确定 .

仅供参考,此问题可归结为反序列化需要仅从嵌入式“$ type”成员中识别对象类型的情况,例如,如果JSON对象位于无类型JSON数组中,它也无法解析转换器,而不仅仅是在顶层 .

基本上,一个对象无法生存通过序列化/反序列化进程的往返,因为虽然WriteJson方法将被调用的转换SerializeObject被调用的时候,当你随后通过JSON字符串DeserializeObject,它无法调用转换器的ReadJson方法,而是构造一个新实例并使用基本成员填充例程 .