2012-03-22 30 views
54

Tôi có một số dữ liệu mà tôi phải tuần tự hóa thành JSON. Tôi đang sử dụng JSON.NET. Cấu trúc mã của tôi là tương tự như sau:Bỏ qua các trường rỗng trong Json.net

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

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

Vấn đề là, sản lượng JSON tôi cần phải có CHỈ Field1 HOẶC Field2 HOẶC Field3 - nó phụ thuộc vào lĩnh vực được sử dụng (ví dụ: không null). Theo mặc định, JSON của tôi trông như thế này:

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

Tôi biết tôi có thể sử dụng NullValueHandling.Ignore, nhưng điều đó mang lại cho tôi JSON trông như thế này:

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

Và những gì tôi cần điều này là:

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

Có cách nào đơn giản để đạt được điều này không?

+0

Bản sao có thể có của [Cách bỏ qua thuộc tính trong lớp nếu không, sử dụng json.net] (http://stackoverflow.com/questions/6507889/how-to-ignore-a-property-in-class-if -null-using-json-net) –

Trả lời

58

Có bạn cần sử dụng JsonSerializerSettings.NullValueHandling = NullValueHandling.Ignore.

Nhưng vì structs are value types bạn cần phải đánh dấu Field2, field3 nullable để có được kết quả mong đợi:

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

Hoặc chỉ cần sử dụng các lớp học thay vì cấu trúc.

Tài liệu: NullValueHandling Enumeration

+1

để biết thêm thông tin, hãy xem http://james.newtonking.com/archive/2009/10/23/efficient-json-with-json-net-reducing-serialized-json-size. aspx –

54

Bạn cũng có thể áp dụng các thuộc tính JsonProperty đến các thuộc tính liên quan và thiết lập xử lý theo cách đó giá trị null. Tham khảo thuộc tính Reference trong ví dụ bên dưới:

Lưu ý: JsonSerializerSettings sẽ ghi đè các thuộc tính.

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

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

    public string Name { get; set; } 
} 

Hth.

Các vấn đề liên quan