当前位置: 首页 > 面试题库 >

Newtonsoft Json.Net序列化JObject即使设置正确也不会忽略null

寇开畅
2023-03-14
问题内容

我正在尝试使用Newtonsoft Json.Net序列化对象。

该对象是一个匿名类型,其中填充了许多异构事物,主要是常规POCO,但也包含JObjects或JArrays。

问题是,将NullValueHandling属性添加到时NullValueHandling.Ignore,每个null属性都将被忽略,但前提是它是“常规”
.Net对象的一部分。JObject或内的每个null属性都会JArray保留。

这是一个最小的示例:

var jobj = JObject.FromObject(new Anything{
    x = 1,
    y = "bla",
    z = null
});

var poco = new Foo {
   foo1 = "bar",
   foo2 = null
};

var serialized = JsonConvert.SerializeObject(new {
    source1 = poco,
    source2 = jobj
}, Newtonsoft.Json.Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore});

是否有一种简单的方法也可以忽略这些空值?我错过了一些设置选项吗?还是我必须手动处理?


问题答案:

一个"null"在值JObject实际上是一个
_非空JValue_与JValue.Type等于JTokenType.Null。当此值实际出现在JSON中时,它表示null的JSON值。我相信它的存在是为了捕获以下两个JSON对象之间的差异:

  "source2": {
    "z": null
  }

  "source2": {
  }

在第一种情况下,该属性"z"带有nullJSON值。在第二种情况下,该属性"z"不存在。Linq-to-
JSON表示第一种情况是null类型,JValue而不是JProperty.Value实际 为null

为防止空令牌渗透到您JObject的值中,请在JObject从某些POCO 创建时使用适当的序列化器设置:

var jobj = JObject.FromObject(new
{
    x = 1,
    y = "bla",
    z = (int?)null
}, new JsonSerializer { NullValueHandling = NullValueHandling.Ignore } );

(请注意,POCO本身本身不一定已经是JObject。无类型方法,JsonConvert.DeserializeObject(jsonString)或者JsonConvert.DeserializeObject<dynamic>(jsonString)默认情况下,JObject当根JSON容器jsonString为JSON对象时,默认情况下将返回a
。)



 类似资料:
  • 问题内容: 我有一个用作调用RESTful Web服务的 模板 。这是通过解析器创建的,由于它被用作告诉用户端点模式的模板,因此我不得不想出一种保留所有属性的方法,这就是为什么将其默认值设置为的原因。作为示例,这是对象最初的外观: 然后,用户可以根据需要填写各个字段,例如和: 表示他们只关心这两个领域。现在,我想将此模板()序列化回一个JSON字符串,但只希望显示填充的那些字段。所以我尝试了这个:

  • 问题内容: 尝试运行gradle时,出现以下错误: 但是,当我检查JAVA_HOME变量时,我得到: 我的JAVA_HOME是在.bashrc中定义的,我已经仔细检查过它是否已设置为源。 运行还确认JAVA_HOME设置正确并且在PATH上。 我还检查了符号连接这反过来又正确的符号链接 另外,我检查了或中没有重复的JAVA_HOME定义。 所以我的问题是Gradle如何/为什么找到,更重要的是如何

  • 我还没有反应过来,所以我为这个问题的无知道歉。 我刚刚创建了一个新的React应用程序,我一直在使用文件夹结构。以下是我当前的文件夹结构: 在/react-app/src/components/app/app.js中,我需要导入logo.svg,它位于/react-app/src/assets/images/logo/logo.svg中。 在App.js中,我有以下行来导入徽标: 我得到以下错误:

  • 我试图在登录屏幕上向用户显示progressLoader,直到web服务响应到来。当我按下登录按钮时,它工作。问题是当我试图在响应中从此行隐藏this.setState({showLoader:false})时,我得到的是未定义的this.setState。即使我在这个问题中正确地设置了上下文,this.setState也不是一个函数

  • 问题内容: 我使用以下代码来序列化从外部服务获得的响应,并作为我的服务的一部分返回json响应。但是,当外部服务返回带有时区(10:30:00.000-05.00)的时间值时,杰克逊会将其转换为15:30:00。如何忽略时区值? 问题答案: 您可以创建自定义解串器 告诉杰克逊使用您的自定义解串器 并像这样使用它: 您可以使用Jackson自定义序列化为服务响应添加时区信息

  • 我有一个这样的对象: 我是否可以使用和我的条件来仅在不为负数的情况下包含该值?或者有没有其他的解决办法我可以做到这一点?