2014-05-06 29 views
10

Tôi có một đối tượng JSON đi kèm với một danh sách dài các mã vùng. Thật không may mỗi mã vùng là tên đối tượng trên một danh sách trong đối tượng Dữ liệu. Làm thế nào để tạo một lớp mà sẽ cho phép RestSharp để deserialize nội dung?Deserialize JSON với các đối tượng động

Sau đây là cách lớp học của tôi trông bây giờ:

public class phaxioResponse 
{ 
    public string success { get; set; } 
    public string message { get; set; } 
    public List<areaCode> data { get; set; } 

    public class areaCode 
    { 
     public string city { get; set; } 
     public string state { get; set; } 
    } 
} 

Và đây là nội dung JSON:

{ 
    success: true 
    message: "277 area codes available." 
    data: { 
     201: { 
      city: "Bayonne, Jersey City, Union City" 
      state: "New Jersey" 
     } 
     202: { 
      city: "Washington" 
     state: "District Of Columbia" 
     } [...] 
} 
+2

Đó json là tất cả các loại phạm lỗi cho lên. –

+0

Và bạn có thực sự mong đợi bất kỳ ai đọc tất cả điều đó không? –

+1

@JohnSaunders bạn không cần phải đọc toàn bộ đối tượng json thông qua - Tôi khá chắc chắn bạn có thể thấy rằng chỉ có ba nút trong đối tượng chính và đối tượng dữ liệu là như nhau tất cả các cách thức thông qua? – PeteFox

Trả lời

17

Kể từ khi JSON đây không phải là C# thân thiện, Tôi đã phải làm một chút hackery để làm cho nó đi ra đúng cách. Tuy nhiên, kết quả là khá tốt đẹp.

var json = JsonConvert.DeserializeObject<dynamic>(sampleJson); 
var data = ((JObject)json.data).Children(); 
var stuff = data.Select(x => new { AreaCode = x.Path.Split('.')[1], City = x.First()["city"], State = x.Last()["state"] }); 

Mã này sẽ tạo loại ẩn danh đại diện tốt nhất cho dữ liệu. Tuy nhiên, loại ẩn danh có thể dễ dàng được thay thế bằng một số ctor cho một lớp DTO bình thường hơn.

Kết quả trông giống như sau:

Deserialization Output

+0

Bạn có thể giải thích * dữ liệu * trong * json.data * không? Cảm ơn bạn –

+0

@HappyBird, điều này xuất phát từ ví dụ JSON được đăng trong câu hỏi. –

0

Tôi không biết gì về RestSharp, nhưng nếu bạn đang sử dụng Newtonsoft trên máy chủ bên cạnh, sau đó bạn chỉ có thể vượt qua JObject vào phương pháp của mình. Sau đó, bạn có thể thẩm vấn đối tượng để xem loại đối tượng mà nó thực sự là gì và sử dụng JObject.ToObject() để chuyển đổi nó.

3

json của bạn là không chính xác, nhưng nếu bạn làm đúng cho nó, bạn có thể sử dụng một công cụ json-to-CSharp như một trong những ngày http://json2csharp.com/ để tạo ra các lớp học của bạn:

public class __invalid_type__201 
{ 
    public string city { get; set; } 
    public string state { get; set; } 
} 

public class Data 
{ 
    public __invalid_type__201 __invalid_name__201 { get; set; } 
} 

public class RootObject 
{ 
    public bool success { get; set; } 
    public string message { get; set; } 
    public Data data { get; set; } 
} 
+1

Đó là một ý tưởng tuyệt vời ... Thật không may là JSON không nằm trong tay tôi - nó đến từ một API bên ngoài – PeteFox

+1

@PeteFox, nó không phải là JSON hợp lệ. Tất cả các tên trường phải nằm trong dấu ngoặc kép để được coi là JSON hợp lệ. Đó là lý do tại sao json2csharp.com đang tạo các lớp không hợp lệ. –

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