JToken.DeepEquals比较null值时类型不匹配的问题咨询
这是Newtonsoft.Json的预期行为
核心原因
当给JObject属性赋值string类型的null变量时,Newtonsoft.Json会生成一个类型为JTokenType.String的JValue(其值为null);而直接赋值null字面量或JToken类型的null变量时,会生成类型为JTokenType.Null的JValue。
JToken.DeepEquals会严格比较JToken的类型和值,因此类型不同的两个null会被判定为不相等。
复现代码结果解析
jObj["str"]的类型是String(值为null的字符串类型JValue),jObj["tkn"]和jObj["ltrl"]是Null类型的JValue,所以b1、b3返回False,b2返回True。- 当JObject被序列化为JSON字符串后,所有类型的null都会被输出为标准的JSON
null;反解析时,JSON的null会统一转为JTokenType.Null类型,因此解析后的所有比较都返回True。
解决方案
如果需要统一生成JTokenType.Null类型的JValue,可采用以下方式:
- 直接使用
null字面量赋值,或显式调用JValue.CreateNull()创建null类型的JToken - 若从字符串变量赋值,可做null判断后处理:
string nullStr = null; var jObj = new JObject() { ["str"] = nullStr == null ? JValue.CreateNull() : nullStr };
内容的提问来源于stack exchange,提问作者Matthew Tenczar
相关产品推荐
相关产品推荐

