2014-04-05 16 views
5

Tôi đang viết trình bao bọc C# cho API JSON RESTful và sử dụng Json.NET để deserialize json đến đối tượng được nhập mạnh. nhưng một vài thuộc tính trong json đến rất năng động, nó sẽ là đối tượng json với số lượng và kiểu thuộc tính khác nhau. Giải pháp hiện tại của tôi là, tôi ánh xạ thuộc tính json động tới Dictionary<string, object> (từ điển lồng nhau) trong lớp C# của tôi và viết JsonConverter tùy chỉnh để chuyển đổi json động thành từ điển lồng nhau. Lớp học của tôi trông giống như sau:Thiết kế trình bao bọc REST API: trả về json động như JSON.NET JObject/JArray

public class Item 
{ 
    [JsonProperty("item_id")] 
    public int ItemId { get; set; } 

    [JsonProperty("type")] 
    public string Type { get; set; } 

    //Property to map dynamic json object 
    [JsonProperty("data")] 
    public Dictionary<string, object> Data { get; set; } 
} 

Thành công.

Vấn đề là, rất khó truy cập dữ liệu từ từ điển lồng nhau này cho người dùng cuối, chúng tôi thậm chí không thể xem cấu trúc dữ liệu mà không gỡ lỗi nó trong Visual studio là gì. Bây giờ tôi đang lập kế hoạch sử dụng JObject hoặc JArray thay vì từ điển lồng nhau. Vì vậy, chúng ta có thể thấy cấu trúc dữ liệu bằng cách chỉ cần gọi phương thức ToString (Sẽ xuất dữ liệu json gốc dưới dạng chuỗi) cũng như các kiểu này có hỗ trợ LINQ để người dùng có thể truy cập dữ liệu từ nó một cách dễ dàng. Đây có phải là một thực hành tốt sử dụng điều này, xem xét JObjectJArray cả hai đều phụ thuộc vào thư viện của bên thứ ba (Dù sao Json.NET là phụ thuộc cho thư viện của tôi vì tôi đang sử dụng nó để tuần tự hóa json). Hoặc có một số cách khác để làm điều này?

Trả lời

2

Thay vào đó, bạn nên sử dụng ExpandoObjectConverter.

Bạn cần nhập IDictionary<string, object> là chỉ dynamic và trang trí toàn bộ thuộc tính với [JsonConverter(typeof(ExpandoObjectConverter))].

Một chi tiết thú vị là ExpandoObject cũng thực hiện IDictionary<string, object>, nhưng khi bạn nhập nó với dynamic, bạn có thể truy cập các thuộc tính liên quan như thông thường! ;)

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