【问题标题】:Newtonsoft Json.Net serialize JObject doesn't ignore nulls, even with the right settingsNewtonsoft Json.Net 序列化 JObject 不会忽略空值,即使设置正确
【发布时间】:2015-03-25 14:32:37
【问题描述】:

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

这个对象是一个匿名类型,里面填充了很多异构的东西,主要是常规的POCO,也有一些JObjects 或JArrays。

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

这是一个最小的例子:

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 条目会改变索引;在这种情况下,您需要手动处理。
  • 此代码无法编译,因为 1) 没有 Foo 类型(不,这不是挑剔,因为问题可能出在该类型的定义中),以及 2) 你可以t 将 null 文字分配给匿名类型属性。
  • @erikkallen 好的,第二个,我手动输入的,这是来自现实生活中的真实对象,但我不能直接对它们采取行动。已更正。对于“没有 Foo 类型”,你是对的,这种类型称为 Column,但这无关紧要,因为这些对象被完美地序列化了。

标签: c# json json.net


【解决方案1】:

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

  "source2": {
    "z": null
  }

  "source2": {
  }

在第一种情况下,"z" 属性与 null JSON 值一起存在。在第二种情况下,属性"z" 不存在。 Linq-to-JSON 表示第一个具有空类型 JValue 而不是 JProperty.Value 实际上为空的情况。

为防止空令牌潜入您的JObject 的值,请在从某些 POCO 创建JObject 时使用适当的序列化程序设置:

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

(注意POCO本身不能是JObject。当jsonString中的根JSON容器是JSON对象时,无类型方法JsonConvert.DeserializeObject(jsonString)JsonConvert.DeserializeObject<dynamic>(jsonString)将默认返回JObject .)

【讨论】:

【解决方案2】:

在您的字段名称上方添加 JsonProperty 装饰器:

    [JsonProperty("bookmark", NullValueHandling = NullValueHandling.Ignore)]
    public string Bookmark { get; set; }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多