为何需将自定义转换器传入DeserializeObject而非使用ItemConverterType?
问题原因分析
1. 反序列化目标类型错误
第一个示例里,你直接反序列化的是MyType类型,但[JsonProperty]特性是标注在MyData类的属性上的。Json.NET只有在反序列化MyData对象时,才会读取该类属性上的特性配置,你完全没用到MyData,所以标注的ItemConverterType根本不会被触发。
2. ItemConverterType用法错误
就算你改成反序列化MyData,这个特性也不适合当前场景——它是用来给集合/字典类型属性中的元素指定转换器的(比如List<MyType>这类集合,给集合里的每个MyType元素配置转换器)。你的属性是单个MyType对象,要给单个属性类型指定转换器,得用ConverterType才对。
修正后的正确示例
如果想通过特性让转换器生效,需要修改特性类型并正确指定反序列化目标:
public class MyData { [JsonProperty("type", ConverterType = typeof(MyTypeJsonConverter))] public MyType MyType { get; set; } } static void foo() { var json = "{\"type\":\"data\"}"; // 反序列化MyData类型,而非直接反序列化MyType var obj = JsonConvert.DeserializeObject<MyData>(json); }
第二个示例生效的原因
第二个示例是把转换器直接传入DeserializeObject方法,相当于给本次反序列化操作全局指定了MyType的转换器,不管你反序列化的是MyType本身还是包含它的对象,都会触发这个转换器,所以能正常调用。
内容的提问来源于stack exchange,提问作者theateist
相关产品推荐
相关产品推荐

