忽略 Json.net 中的空字段

Posted

技术标签:

【中文标题】忽略 Json.net 中的空字段【英文标题】:Ignoring null fields in Json.net 【发布时间】:2012-03-22 09:38:52 【问题描述】:

我有一些数据必须序列化为 JSON。我正在使用 JSON.NET。我的代码结构是这样的:

public struct structA

    public string Field1;
    public structB Field2;
    public structB Field3;


public struct structB

    public string Subfield1;
    public string Subfield2;

问题是,我的 JSON 输出只需要 Field1Field2Field3 - 这取决于使用哪个字段(即不为空)。 默认情况下,我的 JSON 如下所示:


    "Field1": null,
    "Field2": "Subfield1": "test1", "Subfield2": "test2",
    "Field3": "Subfield1": null, "Subfield2": null,

我知道我可以使用NullValueHandling.Ignore,但这给了我这样的 JSON:


    "Field2": "Subfield1": "test1", "Subfield2": "test2",
    "Field3": 

而我需要的是这个:


    "Field2": "Subfield1": "test1", "Subfield2": "test2",

有没有简单的方法来实现这一点?

【问题讨论】:

How to ignore a property in class if null, using json.net的可能重复 因为您使用的是structs,所以唯一可能有空值的字段是Field1。如果希望 Field2 和 Field3 可以为空,则需要将它们设为引用类型而不是值类型。 【参考方案1】:

是的,您需要使用JsonSerializerSettings.NullValueHandling = NullValueHandling.Ignore

但是因为structs are value types你需要将Field2、Field3标记为nullable才能得到预期的结果:

public struct structA

    public string Field1;
    public structB? Field2;
    public structB? Field3;

或者只使用类而不是结构。

文档:NullValueHandling Enumeration

【讨论】:

更多信息见james.newtonking.com/archive/2009/10/23/…【参考方案2】:

您还可以将 JsonProperty 属性应用于相关属性,并以这种方式设置空值处理。请参考以下示例中的Reference 属性:

注意:JsonSerializerSettings 将覆盖属性。

public class Person

    public int Id  get; set; 
    
    [JsonProperty( NullValueHandling = NullValueHandling.Ignore )]
    public int? Reference  get; set; 

    public string Name  get; set; 

【讨论】:

以上是关于忽略 Json.net 中的空字段的主要内容,如果未能解决你的问题,请参考以下文章

如何忽略 ExtJS 数据模型中的空字段?

使用 XSLT 删除 XML 消息中的空元素字段和默认值

检查输入字段中的空值的正确方法是啥[重复]

Json.net 忽略实体某些属性的序列化

mongoDB 3.2中的唯一索引忽略空值

MongoDB 检查 $switch 语句中的空字段