75

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?

2
  • Possible duplicate of How to ignore a property in class if null, using json.net Commented Aug 12, 2016 at 8:20
  • Because you are using structs, the only field that may have a null value is Field1. If you want Field2 and Field3 to be nulllable, you need to make them reference types instead of value types. Commented Aug 16, 2021 at 15:07

2 Answers 2

80

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

Sign up to request clarification or add additional context in comments.

1 Comment

78

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; }
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.