2012-07-04 28 views
33

Tôi đang cố gắng sắp xếp một số đối tượng kế thừa mà "lười biếng tạo" các danh sách khác nhau. Tôi không thể thay đổi hành vi cũ.Newtonsoft Json.NET có thể bỏ qua tuần tự hóa danh sách trống không?

Tôi đã luộc nó xuống để ví dụ này đơn giản:

public class Junk 
{ 
    protected int _id; 

    [JsonProperty(PropertyName = "Identity")] 
    public int ID 
    { 
     get 
     { 
      return _id; 
     } 

     set 
     { 
      _id = value; 
     } 
    } 

    protected List<int> _numbers; 
    public List<int> Numbers 
    { 
     get 
     { 
      if(null == _numbers) 
      { 
       _numbers = new List<int>(); 
      } 

      return _numbers; 
     } 

     set 
     { 
      _numbers = value; 
     } 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Junk j = new Junk() { ID = 123 }; 

     string newtonSoftJson = JsonConvert.SerializeObject(j, Newtonsoft.Json.Formatting.Indented); 

     Console.WriteLine(newtonSoftJson); 

    } 
} 

Kết quả hiện tại là: { "Identity": 123, "số": [] }

tôi sẽ muốn nhận được: { "Danh tính": 123 }

Tức là, tôi muốn bỏ qua bất kỳ danh sách, collec nào tions, mảng hoặc những thứ trống rỗng.

Trả lời

49

Trong trường hợp bạn không tìm thấy giải pháp cho việc này, the answer thật đơn giản khi bạn quản lý để theo dõi nó.

Nếu bạn được phép gia hạn lớp gốc, hãy thêm chức năng ShouldSerializePropertyName vào đó. Điều này sẽ trả về một Boolean cho biết thuộc tính đó có nên được tuần tự hóa cho cá thể hiện tại của lớp hay không. Trong ví dụ của bạn này có thể trông như thế này (không được thử nghiệm nhưng bạn sẽ nhận được hình ảnh):

public bool ShouldSerializeNumbers() 
{ 
    return _numbers.Count > 0; 
} 

Cách tiếp cận này làm việc cho tôi (mặc dù trong VB.NET). Nếu bạn không được phép sửa đổi lớp gốc thì cách tiếp cận IContractResolver được mô tả trên trang được liên kết là cách để đi.

+12

Bạn có thể đơn giản hóa điều này thành 'return (_numbers.Count> 0); ' –

+2

Tôi thích nó! Đẹp nhất. –

+3

tôi có thể làm theo cách chung chung không? Tôi không biết tất cả các tên thuộc tính nhưng muốn tất cả các mảng trống rỗng. – Rohit

1

Chỉ cần được pendantic commonorgarden, tôi có cấu trúc nếu thử nghiệm là:

public bool ShouldSerializecommunicationmethods() 
{ 
    if (communicationmethods != null && communicationmethods.communicationmethod != null && communicationmethods.communicationmethod.Count > 0) 
     return true; 
    else 
     return false; 
} 

Là một danh sách trống thường sẽ được null quá. Cảm ơn bạn đã đăng giải pháp. ATB.

+3

Một tùy chọn khác mà bạn có là sử dụng thuộc tính "NullValueHandling": [JsonProperty ("yourPropertyName", NullValueHandling = NullValueHandling.Ignore)]. Điều đó sẽ giúp giảm sự cần thiết cho việc kiểm tra null mà sẽ tinh chỉnh của bạn nếu kiểm tra một chút. Chỉ cần nghĩ rằng tôi muốn đề cập đến nó như bạn có thể tìm thấy nó tiện dụng. –

+0

Trong phương thức ShouldSerialize bạn vẫn cần phải kiểm tra null, nếu không một cuộc gọi đến ShouldSerialize sẽ ném một ngoại lệ về null. Ngay cả khi serializer được mã hóa để bỏ qua các ngoại lệ khi kiểm tra các phương thức ShouldSerialize, ngoại lệ được nêu ra sẽ thêm một chi phí không cần thiết có thể ảnh hưởng đến hiệu suất. Vì vậy, bạn có khả năng đạt được nhiều hơn bạn mất bằng cách kiểm tra null trước. –

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