Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在NewtonSoft JSON树中使用空值?_C#_Null_Json.net - Fatal编程技术网

C# 如何在NewtonSoft JSON树中使用空值?

C# 如何在NewtonSoft JSON树中使用空值?,c#,null,json.net,C#,Null,Json.net,我想在如下树中使用null值: using Newtonsoft.Json.Linq; jObject jX = new JObject( new JProperty("name" : "Amsterdam"), booleanfunction(x) ? null : new JProperty("phone", 1234567890) ); using System.Xml.Linq; XElement Xvar = new XElement("div",

我想在如下树中使用
null
值:

using Newtonsoft.Json.Linq;
jObject jX = new JObject(
  new JProperty("name" : "Amsterdam"),
  booleanfunction(x) ?
    null
    :
    new JProperty("phone", 1234567890)
);
using System.Xml.Linq;
XElement Xvar =
  new XElement("div",
    _IsInvoice ? 
      null
      :
      new XElement("p", "sometext")
  );
但是
null
似乎导致运行时异常
无法将Newtonsoft.Json.Linq.JValue添加到Newtonsoft.Json.Linq.JObject

我觉得这很遗憾,因为我习惯于对一棵树做类似的事情,比如:

using Newtonsoft.Json.Linq;
jObject jX = new JObject(
  new JProperty("name" : "Amsterdam"),
  booleanfunction(x) ?
    null
    :
    new JProperty("phone", 1234567890)
);
using System.Xml.Linq;
XElement Xvar =
  new XElement("div",
    _IsInvoice ? 
      null
      :
      new XElement("p", "sometext")
  );
那么,为什么XElement可以很好地工作,而Newtonsoft不能,或者我如何让它与Newtonsoft一起工作

问题还可以是:


如何使用Linq在树中有条件地添加元素?如果没有三元运算符(x?y:z),就可以用“<代码> >在树的中间是否?< /P> < P> <代码> JObject < /C> >在构造函数中不接受<代码> 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
块中的
JProperty
手机
连接到
JObject
中,您可以在线检查它,并确定值应为空的位置:

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

在这方面,Newtonsoft似乎与XElements有所不同。因此,最好避免使用
null
,或者插入一个伪属性,或者不使用三元属性?根本不需要手术

在这两种情况下,在构建该树之后,我们可以使用
Remove(stringpropertyname)
除去伪元素或不需要的元素


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

因为json
{“name”:“Amsterdam”,null}
无效。。。可能有效的是
{“name”:“Amsterdam”}
{“name”:“Amsterdam”,“phone”:null}
因此,如果
booleanformation(x)
计算结果为false,则需要添加此属性
新的JProperty(“phone”,1234567890)
如果
booleanformation(x)
计算结果为false?@KunalMukherjee我需要的是向JObject添加一组JProperty元素。但是,一个JProperty只能在某些条件下包含,例如,如果该值不为null。用这个三元?运算符非常有用,但在Json树中似乎不可能实现这一点。您可以使用Linq
new JProperty[]{new JProperty(“name”:“Amsterdam”),booleanfunction(x)?null:new JProperty(“phone”,1234567890)}。其中(x=>x!=null)。ToArray()
@Selvin是一个很好的解决方案,但它只适用于数组。很好,但是如何根据某些条件包含整个
phone
属性?@Roland你所说的整个phone属性是什么意思?我的意思是JObject要么具有name属性,要么同时具有name和phone属性,这取决于布尔函数的结果。事实上,有其他方法可以使用或不使用某些元素来构建树。然而,我发现使用XElement的方法非常优雅简洁,并且避免了重复代码。想象一下,树可能有更多的条件部分。