【问题标题】:How to use NULL value in NewtonSoft JSON tree?如何在 NewtonSoft JSON 树中使用 NULL 值?
【发布时间】:2019-03-18 15:01:34
【问题描述】:

我想在这样的树中使用null 值:

using Newtonsoft.Json.Linq;
jObject jX = new JObject(
  new JProperty("name" : "Amsterdam"),
  booleanfunction(x) ?
    null
    :
    new JProperty("phone", 1234567890)
);

null 似乎会导致运行时异常Can not add Newtonsoft.Json.Linq.JValue to Newtonsoft.Json.Linq.JObject

我觉得这很可惜,因为我习惯用 XElement 的树做类似的事情,像这样:

using System.Xml.Linq;
XElement Xvar =
  new XElement("div",
    _IsInvoice ? 
      null
      :
      new XElement("p", "sometext")
  );

那么为什么这在 XElement 上工作得很好,而不是在 Newtonsoft 上,或者我如何让它也与 Newtonsoft 一起工作?

问题也可能是:

如何使用 Linq 有条件地在树中添加元素?是否可以不使用三元运算符 (x ? y : z),只在树的中间加上 if

【问题讨论】:

  • 因为 json { "name" : "Amsterdam", null } 无效......可能有效的是 { "name" : "Amsterdam"}{ "name" : "Amsterdam", "phone" : null }
  • 所以如果booleanfunction(x) 的计算结果为 false,您想添加此属性new JProperty("phone", 1234567890) 吗?
  • @KunalMukherjee 我需要向 JObject 添加一堆 JProperty 元素。但是,一个 JProperty 只应在某些条件下包含,例如如果值不为空。使用 XElement 这个三元?运算符非常有用,但对于 Json 树似乎不可能。
  • 你可以用 Linq 做到这一点new JProperty[] { new JProperty("name" : "Amsterdam"), booleanfunction(x) ? null : new JProperty("phone", 1234567890)}.Where(x=>x !=null).ToArray()
  • @Selvin 很好的解决方案,但它只适用于数组。

标签: c# null json.net


【解决方案1】:

JObject 在其构造函数中不接受null。您可以通过将代码更改为以下内容来解决此问题:

using Newtonsoft.Json.Linq;
jObject jX;
if(booleanfunction(x)) {
    jX = new JObject(new JProperty("name" : "Amsterdam"));
} else {
    jX = new JObject(new JProperty("name" : "Amsterdam"), new JProperty("phone", 1234567890));
}

您也可以将 else 块中的 Add JProperty phone JObject

【讨论】:

  • 确实有其他方法可以使用或不使用某些元素来构建树。但是,我发现使用 XElement 的方法非常优雅简洁,并且避免了重复代码。并想象这棵树可能有更多的条件部分。 . .
【解决方案2】:

您可以内联检查并确定该值应为 null 的位置:

using Newtonsoft.Json.Linq;
jObject jX = new JObject(
  new JProperty("name" : "Amsterdam"),
    new JProperty("phone", booleanfunction(x)? "1234567890": null)
);

【讨论】:

  • 很好,但是如何根据某些条件包含整个 phone 属性?
  • @Roland 你所说的整个手机财产是什么意思?
  • 我的意思是 JObject 要么具有 name 属性,要么具有 name 和 phone 属性,具体取决于 booleanfunction 结果。
【解决方案3】:

Newtonsoft 在这方面似乎与 XElements 不同。所以最好避免 null 并插入一个虚拟属性,或者不使用三元?操作。

在这两种情况下,在构建该树之后,我们都可以使用Remove(string propertyName) 来删除虚拟元素或不需要的元素。

如果有人有更好的解决方案可以“一次性”构建正确的树,欢迎!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-21
    • 2017-06-11
    相关资源
    最近更新 更多