Игнорирование пустых полей в 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;
}

проблема в том, что мой вывод JSON должен иметь только Field1 или Field2 или Field3 - это зависит от того, какое поле используется (т. е. не null). По умолчанию мой 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"},
}

Is есть простой способ добиться этого?

2 62

2 ответа:

да, вам нужно использовать JsonSerializerSettings.NullValueHandling = NullValueHandling.Ignore.

а потому что структуры-это типы значений вам нужно отметить Field2, Field3 nullable чтобы получить ожидаемый результат:

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

или просто использовать классы вместо структур.

документы: NullValueHandling Перечисления

вы также можете применить атрибут 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; }
}

НТН.