繁体   English   中英

json.net 中的奇怪行为:为什么将 null JToken 替换为非 null 值?

[英]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 JObjectIssue with JSON null handling在牛顿软件

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM