忽略Json.net中的空字段

Tha*_*ven 67 .net c# serialization json json.net

我有一些数据,我必须序列化为JSON.我正在使用JSON.NET.我的代码结构与此类似:

public struct structA
{
    public string Field1;
    public structB Field2;
    public structB Field3;
}

public struct structB
{
    public string Subfield1;
    public string Subfield2;
}
Run Code Online (Sandbox Code Playgroud)

问题是,我的JSON输出需要只有Field1OR Field2Field3- 它取决于使用哪个字段(即不为空).默认情况下,我的JSON看起来像这样:

{
    "Field1": null,
    "Field2": {"Subfield1": "test1", "Subfield2": "test2"},
    "Field3": {"Subfield1": null, "Subfield2": null},
}
Run Code Online (Sandbox Code Playgroud)

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

{
    "Field2": {"Subfield1": "test1", "Subfield2": "test2"},
    "Field3": {}
}
Run Code Online (Sandbox Code Playgroud)

而我需要的是:

{
    "Field2": {"Subfield1": "test1", "Subfield2": "test2"},
}
Run Code Online (Sandbox Code Playgroud)

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

nem*_*esv 74

是的你需要使用JsonSerializerSettings.NullValueHandling = NullValueHandling.Ignore.

但是因为结构是值类型,所以需要标记Field2,Field3可以为以获得预期结果:

public struct structA
{
    public string Field1;
    public structB? Field2;
    public structB? Field3;
}
Run Code Online (Sandbox Code Playgroud)

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

文档:NullValueHandling枚举


Jaa*_*ans 71

您还可以将JsonProperty属性应用于相关属性,并以此方式设置null值处理.请参阅Reference以下示例中的属性:

注意:JsonSerializerSettings将覆盖属性.

public class Person
{
    public int Id { get; set; }

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

    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

心连心.