如何修改Newtonsoft.Json反序列化空对象{}的默认行为?
如何修改Newtonsoft.Json反序列化空JSON的行为
可以修改这个行为,这里提供几种实现思路:
思路1:把空JSON对象反序列化为null
写一个自定义JsonConverter,判断输入的JSON是否是空对象,是的话直接返回null,否则正常反序列化:
public class TempConverter : JsonConverter<Temp> { public override Temp ReadJson(JsonReader reader, Type objectType, Temp existingValue, bool hasExistingValue, JsonSerializer serializer) { var jObject = JObject.Load(reader); if (!jObject.HasValues) return null; return jObject.ToObject<Temp>(serializer); } public override void WriteJson(JsonWriter writer, Temp value, JsonSerializer serializer) { serializer.Serialize(writer, value); } }
使用时指定转换器:
var settings = new JsonSerializerSettings { Converters = new List<JsonConverter> { new TempConverter() } }; var obj = JsonConvert.DeserializeObject<Temp>("{}", settings); // 此时obj为null
思路2:遇到空JSON对象时触发异常
同样用自定义转换器,检测到空JSON就抛出异常:
public class TempStrictConverter : JsonConverter<Temp> { public override Temp ReadJson(JsonReader reader, Type objectType, Temp existingValue, bool hasExistingValue, JsonSerializer serializer) { var jObject = JObject.Load(reader); if (!jObject.HasValues) throw new JsonSerializationException("空JSON对象无法转换为Temp实例"); return jObject.ToObject<Temp>(serializer); } public override void WriteJson(JsonWriter writer, Temp value, JsonSerializer serializer) { serializer.Serialize(writer, value); } }
调用示例:
var settings = new JsonSerializerSettings { Converters = new List<JsonConverter> { new TempStrictConverter() } }; try { var obj = JsonConvert.DeserializeObject<Temp>("{}", settings); } catch (JsonSerializationException ex) { // 处理异常逻辑 }
额外思路:标记必填属性触发异常
如果你的Temp类有必须赋值的属性,可以给这些属性添加[JsonProperty(Required = Required.Always)]特性,这样当JSON中缺少这些属性时(包括空JSON对象的情况),Newtonsoft.Json会直接抛出异常:
class Temp { [JsonProperty(Required = Required.Always)] public string Field1 { get; set; } [JsonProperty(Required = Required.Always)] public int Field2 { get; set; } [JsonProperty(Required = Required.Always)] public bool Field3 { get; set; } // 其他属性... }
此时反序列化"{}"会抛出JsonSerializationException,提示缺少必填的Field1、Field2等属性。
内容的提问来源于stack exchange,提问作者Валентин Никин
相关产品推荐
相关产品推荐

