如何让JsonConvert.Deserialize/JToken.Parse忽略NULL值使jt["a"]为null?
关于Newtonsoft.Json反序列化时让
jt["a"]返回null的实现方案 你的需求是合理的,Newtonsoft.Json默认会把JSON中显式声明的null值解析为JTokenType.Null类型的节点,而不是直接移除对应的键值对,所以才会出现jt["a"] != null但jt["a"].Type == JTokenType.Null的情况。要实现jt["a"] == null,可以通过以下两种方式处理:
方式一:自定义JsonConverter实现自动过滤
编写一个针对JObject的转换器,在反序列化过程中自动移除值为JTokenType.Null的节点:
public class IgnoreNullJTokenConverter : JsonConverter<JObject> { public override JObject ReadJson(JsonReader reader, Type objectType, JObject existingValue, bool hasExistingValue, JsonSerializer serializer) { var jObject = JObject.Load(reader); // 筛选出所有值为Null类型的属性并移除 var nullProperties = jObject.Properties().Where(p => p.Value.Type == JTokenType.Null).ToList(); foreach (var prop in nullProperties) { prop.Remove(); } return jObject; } public override void WriteJson(JsonWriter writer, JObject value, JsonSerializer serializer) { var filteredObject = new JObject(); // 序列化时同样过滤Null类型节点 foreach (var prop in value.Properties()) { if (prop.Value.Type != JTokenType.Null) { filteredObject.Add(prop); } } filteredObject.WriteTo(writer); } }
使用示例:
string json = "{\"a\":null}"; var settings = new JsonSerializerSettings { Converters = new List<JsonConverter> { new IgnoreNullJTokenConverter() } }; JToken jt = JsonConvert.DeserializeObject<JToken>(json, settings); // 此时jt["a"]将返回null
方式二:解析完成后手动过滤
如果不需要全局生效,也可以在解析完成后手动移除所有JTokenType.Null类型的节点:
string json = "{\"a\":null}"; JObject jObject = JObject.Parse(json); // 批量移除值为Null的属性 jObject.Properties() .Where(p => p.Value.Type == JTokenType.Null) .ToList() .ForEach(p => p.Remove()); // 处理后jObject["a"]返回null
补充说明
Newtonsoft.Json默认的行为是为了区分键不存在和键存在但值为null这两种不同的JSON语义,所以会保留显式声明的null节点。你的需求本质是将这两种情况视为等价,因此需要通过额外的过滤逻辑来实现。
内容的提问来源于stack exchange,提问作者Denis
相关产品推荐
相关产品推荐

