2012-03-22 11 views
54

Mam pewne dane, które muszę serializować do JSON. Używam JSON.NET. Moja struktura kodu jest podobny do tego:Ignorowanie pól pustych w Json.net

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

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

Problem jest moje wyjście JSON musi mieć tylko Field1 LUB Field2 LUB Field3 - to zależy od tego, które pole jest używane (nie znaczy null). Domyślnie mój JSON wygląda następująco:

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

wiem, że mogę używać NullValueHandling.Ignore, ale to daje mi JSON, który wygląda tak:

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

A czego potrzebuję to:

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

Czy istnieje prosty sposób, aby to osiągnąć?

+0

Możliwy duplikat [Jak zignorować właściwość w klasie, jeśli jest pusta, za pomocą json.net] (http://stackoverflow.com/questions/6507889/how-to-ignore-a-property-in-class-if -null-using-json-net) –

Odpowiedz

58

Tak, musisz użyć JsonSerializerSettings.NullValueHandling = NullValueHandling.Ignore.

Ale ponieważ structs are value types trzeba zaznaczyć Pole2, Field3 pustych, aby uzyskać oczekiwany rezultat:

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

Albo po prostu użyć klasy zamiast elemencie.

Dokumentacja: NullValueHandling Enumeration

+1

, aby uzyskać więcej informacji, patrz http://james.newtonking.com/archive/2009/10/23/efficient-json-with-json-net-reducing-serialized-json-size. aspx –

54

Można także zastosować atrybut JsonProperty do odpowiednich właściwości i ustawić wartość zerową obsługi tamtędy. Zobacz właściwość Reference w poniższym przykładzie:

Uwaga: JsonSerializerSettings zastąpi atrybuty.

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

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

    public string Name { get; set; } 
} 

Hth.

Powiązane problemy