JSON.NET中ToObject<T>()方法何时会返回null?
JObject.ToObject() 返回null的场景
先说明:JObject是Newtonsoft.Json里专门表示JSON对象的类型,它没法直接表示JSON null(JSON null用JValue.CreateNull()表示)。如果JObject变量本身是null,调用ToObject<T>()会直接抛NullReferenceException,不会返回null。
当JObject是有效的JSON对象实例时,调用ToObject<T>()返回null的情况有这些:
目标类型是可空值类型(比如
int?、Guid?),且JSON对象没法转成对应的值类型
因为JSON对象的结构和值类型不兼容,转换器生成不了有效的值类型实例,就会返回null。示例:// 空JSON对象转可空int JObject x = new JObject(); int? result = x.ToObject<int?>(); // 返回null // 带字符串属性的JSON对象转可空decimal JObject y = JObject.Parse("{\"Name\": \"测试\"}"); decimal? decimalResult = y.ToObject<decimal?>(); // 返回null目标类型是引用类型,且自定义JsonConverter返回null
如果你给目标类型T注册了自定义的JsonConverter,转换时这个转换器返回null,那ToObject<T>()就会直接返回null。示例:// 自定义转换器,始终返回null public class NullConverter : JsonConverter<MyClass> { public override MyClass ReadJson(JsonReader reader, Type objectType, MyClass existingValue, bool hasExistingValue, JsonSerializer serializer) { return null; } public override void WriteJson(JsonWriter writer, MyClass value, JsonSerializer serializer) { writer.WriteNull(); } } // 使用这个转换器转换JObject JObject x = JObject.Parse("{\"Id\": 1}"); var settings = new JsonSerializerSettings(); settings.Converters.Add(new NullConverter()); MyClass result = x.ToObject<MyClass>(settings); // 返回null目标类型是抽象类/接口,且没配置多态转换规则
如果T是抽象类或者接口,又没配置TypeNameHandling这类规则让转换器识别具体实现类,转换器没法创建实例,就会返回null。示例:public interface IMyInterface { } public class MyImpl : IMyInterface { } JObject x = JObject.Parse("{\"Id\": 1}"); // 没配置多态处理,无法生成具体实例 IMyInterface result = x.ToObject<IMyInterface>(); // 返回null极端配置下的object类型转换
这种情况很少见,比如配置了NullValueHandling = NullValueHandling.Ignore且JSON对象没有任何有效属性,同时转换器被设置为返回null,此时转object类型会返回null。
内容的提问来源于stack exchange,提问作者Node.JS
相关产品推荐
相关产品推荐

