[英]Strange behavior in json.net: why is a null JToken replaced with a non-null value?
这使用 json.net (C#)。 不知道为什么 JToken 不为空。
var obj = new JObject();
obj["field1"] = null;
var token = obj["field1"];
Console.WriteLine(token == null); // false
Console.WriteLine(token.ToString() == ""); // true
Console.WriteLine(token.Type == JTokenType.Null); // true
这是设计使然。
Json.NET 不允许实际的空JToken
值出现在JToken
层次结构中,无论是作为JArray
成员还是作为JProperty
值。 相反,如果应用程序代码尝试设置或添加null
标记,它会被替换为JValue.Type
等于 JTokenType.Null 的非JValue
JTokenType.Null
。 这种替换发生在例如JContainer.EnsureParentToken(JToken item, bool skipParentCheck)
:
internal JToken EnsureParentToken(JToken item, bool skipParentCheck)
{
if (item == null)
{
return JValue.CreateNull();
}
以及JProperty.Value
:
public JToken Value
{
set
{
CheckReentrancy();
JToken newValue = value ?? JValue.CreateNull();
我相信 Newtonsoft 这样做是为了捕捉以下两个 JSON 对象之间的差异:
{
"field1": null
}
和空对象:
{ }
在第一种情况下,属性"field1"
存在一个null
JSON 值。 在第二种情况下,属性"field1"
不存在。 Linq-to-JSON 表示第一个具有空类型JValue
而不是JProperty.Value
实际上为 null的情况。 它可能会这样做,因为如果没有, object["field1"]
在这两种情况下都会返回null
,从而使它们更难区分。 (与Dictionary<TKey, TValue>
不同,当尝试访问不存在的属性的值时, JObject
不会抛出KeyNotFoundException
。相反, JObject.Item[String]
为缺少的键的值返回空JValue
。)
你的代码, obj["field1"] = null;
,创建第一种形式的 JSON 对象,如果您检查obj.ToString()
的值,您可以看到该对象。 因此obj["field1"]
返回非 null
如果您不需要区分缺失和空值属性,则可以引入扩展方法来检查空值,例如Checking for empty/null JToken in a JObject或Issue with JSON null handling在牛顿软件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.