2013-05-24 31 views
5

Im sử dụng API MVC/Web từ MVC 4.5 để phục vụ một dịch vụ JSON.Làm thế nào tôi có thể ngừng serialization JSON .net tham chiếu các phần tử trước?

Tất cả đều hoạt động tốt cho đến khi được yêu cầu hiển thị kết quả JSON lớn có số lượng dữ liệu lặp lại nhất định. Đối với những người không chắc chắn những gì tôi có ý nghĩa, nếu ví dụ tôi có một danh sách các cuốn sách, trong đó mỗi cuốn sách có đầy đủ dữ liệu tác giả, .net sẽ thay đổi phiên bản thứ 2 của cùng một tác giả để tham khảo trước đó, thay vào đó sao chép dữ liệu. Trong những trường hợp này, nó sử dụng tham chiếu $ X, trong đó X là chỉ mục của mục cần tham chiếu.

Trong khi tôi đánh giá cao của nó một tiết kiệm hiệu quả, định dạng này không thể được tiêu thụ bởi khách hàng của chúng tôi ứng dụng

Trả lời

3

Các Json.NET có một thiết lập nào có thể làm kỳ diệu mà ... Đó là Bảo tồn Object Tài liệu tham khảo và đây là liên kết đến documentation:

tôi xin nói, rằng những gì bạn đang trải qua, cũng tương tự như một exmple trong doucmentation

một số trích(nhưng, xin vui lòng, xem ngày e tài liệu để biết thêm chi tiết):

Chúng ta hãy có một tuyển tập sưu tập với hai người. Với một thủ thuật nhỏ: thiết PreserveReferencesHandling như thế này

string json = JsonConvert.SerializeObject(
    people, 
    Formatting.Indented, 
    new JsonSerializerSettings 
    { 
    PreserveReferencesHandling = PreserveReferencesHandling.Objects 
    }); 

Chúng tôi có thể nhận được kết quả như thế này:

[ 
    { 
    "$id": "1", 
    "Name": "James", 
    "BirthDate": "1983-03-08T00:00Z", 
    "LastModified": "2012-03-21T05:40Z" 
    }, 
    { 
    "$ref": "1" 
    } 
] 

Những gì chúng ta có thể thấy, rất có thể những gì bạn làm kinh nghiệm. Vì vậy, PreserveReferencesHandling.Objects có vẻ là cài đặt mã của bạn. Vì vậy, cố gắng thiết lập một cách rõ ràng để Không như thế này:

new JsonSerializerSettings 
{ 
    PreserveReferencesHandling = PreserveReferencesHandling.None; 
} 

Và như trong các tài liệu:

... Theo mặc định Json.NET sẽ serialize tất cả các đối tượng nó gặp bằng giá trị . Nếu một danh sách bao gồm hai tài liệu tham khảo Người, và cả hai tài liệu tham khảo điểm đến cùng một đối tượng thì JsonSerializer sẽ viết ra tất cả tên và giá trị cho mỗi tài liệu tham khảo ...

Vì vậy, đây sẽ là thiết lập mặc định một lần nữa

Đọc thú vị khác: Serializing Circular References

+0

+1 Bài viết hay về tham chiếu vòng tròn. –

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