2012-03-22 2 views
54

У меня есть некоторые данные, которые я должен сериализовать в JSON. Я использую JSON.NET. Моя структура код похож на этот:Игнорирование нулевых полей в Json.net

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

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

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

Есть ли простой способ достичь этого?

+0

Возможный дубликат [Как игнорировать свойство в классе, если null, используя json.net] (http://stackoverflow.com/questions/6507889/how-to-ignore-a-property-in-class-if -null-using-json-net) –

ответ

58

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

Но поскольку structs are value types вам нужно отметить Field2, field3 обнуляемым, чтобы получить ожидаемый результат:

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

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

Документация: NullValueHandling Enumeration

+1

для получения дополнительной информации см. http://james.newtonking.com/archive/2009/10/23/efficient-json-with-json-net-reducing-serialized-json-size. ASPX –

54

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

Hth.

Смежные вопросы