Ignoring null fields in Json.net

C#.NetJsonSerializationjson.net

C# Problem Overview


I have some data that I have to serialize to JSON. I'm using JSON.NET. My code structure is similar to this:

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

public struct structB
{
    public string Subfield1;
    public string Subfield2;
}

Problem is, my JSON output needs to have ONLY Field1 OR Field2 OR Field3 - it depends on which field is used (i.e. not null). By default, my JSON looks like this:

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

I know I can use NullValueHandling.Ignore, but that gives me JSON that looks like this:

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

And what I need is this:

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

Is there simple way to achieve this?

C# Solutions


Solution 1 - C#

Yes you need to use JsonSerializerSettings.NullValueHandling = NullValueHandling.Ignore.

But because structs are value types you need to mark Field2, Field3 nullable to get the expected result:

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

Or just use classes instead of structs.

Documentation: NullValueHandling Enumeration

Solution 2 - C#

You can also apply the JsonProperty attribute to the relevant properties and set the null value handling that way. Refer to the Reference property in the example below:

Note: The JsonSerializerSettings will override the attributes.

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

    public string Name { get; set; }
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionThavenView Question on Stackoverflow
Solution 1 - C#nemesvView Answer on Stackoverflow
Solution 2 - C#JaansView Answer on Stackoverflow