2011-10-25 66 views
157

Tôi đang cố gắng loại bỏ một cuộc gọi API biểu đồ bạn bè trên Facebook thành một danh sách các đối tượng. Đối tượng JSON trông giống như:Deserialize JSON với C#

{"data":[{"id":"518523721","name":"ftyft"}, 
     {"id":"527032438","name":"ftyftyf"}, 
     {"id":"527572047","name":"ftgft"}, 
     {"id":"531141884","name":"ftftft"}, 
     {"id":"532652067","name"... 

List<EFacebook> facebooks = new JavaScriptSerializer().Deserialize<List<EFacebook>>(result); 

Nó không hoạt động vì đối tượng nguyên thủy không hợp lệ.
Làm thế nào tôi có thể deserialize này?

+1

viết trình tùy chỉnh deserializer đặc biệt để phục vụ cho json như vậy ... –

+1

hoặc bạn có thể sử dụng một 'Từ điển ', hãy kiểm tra: http://stackoverflow.com/questions/7699972/how-to-decode-a-json-string-using-c/7701070#7701070 – Kakashi

+3

Bạn của bạn: http://json2csharp.com/ – nawfal

Trả lời

204

Bạn cần phải tạo một cấu trúc như thế này:

public class Friends 
{ 

    public List<FacebookFriend> data {get;set;} 
} 

public class FacebookFriend 
{ 

    public string id {get;set;} 
    public string name {get;set;} 
} 

Sau đó, bạn sẽ có thể làm:

Friends facebookFriends = new JavaScriptSerializer().Deserialize<Friends>(result); 

Tên của các lớp học của tôi chỉ là một ví dụ. Bạn nên sử dụng tên riêng.

Thêm thử nghiệm mẫu:

string json= 
    @"{""data"":[{""id"":""518523721"",""name"":""ftyft""}, {""id"":""527032438"",""name"":""ftyftyf""}, {""id"":""527572047"",""name"":""ftgft""}, {""id"":""531141884"",""name"":""ftftft""}]}"; 


Friends facebookFriends = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<Friends>(json); 

foreach(var item in facebookFriends.data) 
{ 
    Console.WriteLine("id: {0}, name: {1}",item.id,item.name); 
} 

Tạo:

id: 518523721, name: ftyft 
id: 527032438, name: ftyftyf 
id: 527572047, name: ftgft 
id: 531141884, name: ftftft 
+1

Yeh, những gì tôi không muốn làm, tạo một đối tượng mới để giữ các childs. Tôi nghĩ rằng Im sẽ xâu chuỗi các json lấy ra các đối tượng nguyên thủy. Cảm ơn bạn. –

+0

@Kevin Holditch cảm ơn sự điều chỉnh. Tôi đã bỏ lỡ một bit quan trọng :) – Icarus

+0

result.Substring (8, result.Length - 9) thực hiện công việc. Xấu xí, nhưng ... –

14

Tôi đồng ý với Icarus (sẽ nhận xét nếu tôi có thể), nhưng thay vì sử dụng một lớp CustomObject, tôi sẽ sử dụng một số từ điển (trong trường hợp facebook thêm một cái gì đó).

private class MyFacebookClass 
{ 
    public IList<IDictionary<string, string>> data { get; set; } 
} 

hoặc

private class MyFacebookClass 
{ 
    public IList<IDictionary<string, object>> data { get; set; } 
} 
+2

Sử dụng các công trình động tốt hơn trong các phiên bản mới. 'public IList > dữ liệu {get; bộ; } ' – BJury

23

rất dễ dàng chúng ta có thể phân tích cú pháp JSON với sự giúp đỡ của từ điển và JavaScriptSerializer. đây là mã mẫu mà tôi phân tích cú pháp json từ tệp ashx.

var jss = new JavaScriptSerializer(); 
string json = new StreamReader(context.Request.InputStream).ReadToEnd(); 
Dictionary<string, string> sData = jss.Deserialize<Dictionary<string, string>>(json); 
string _Name = sData["Name"].ToString(); 
string _Subject = sData["Subject"].ToString(); 
string _Email = sData["Email"].ToString(); 
string _Details = sData["Details"].ToString(); 
+1

Giải pháp này rất hữu ích nếu bạn không có thời gian hoặc cần tạo hợp đồng dữ liệu. Đặc biệt là nếu bạn chỉ quan tâm đến một vài thuộc tính được chôn sâu trong cấu trúc JSON. Trong trường hợp đó, bạn có thể sử dụng một loạt các câu lệnh để điều hướng đến những gì bạn cần. Lưu ý: loại để deserialize cũng có thể là một trong những điều sau đây: Từ điển hoặc ArrayList (khi một nút có cấu trúc lặp lại). –

+1

Tôi nhận được một ngoại lệ thời gian chạy với điều này: Không có constructor parameterless được định nghĩa cho loại 'System.String' trên dòng mã Deserialize. –

36

Đôi khi tôi thích đối tượng động

public JsonResult GetJson() 
{ 
    string res; 
    WebClient client = new WebClient(); 

    // Download string. 
    string value = client.DownloadString("https://api.instagram.com/v1/users/000000000/media/recent/?client_id=clientId"); 

    // Write values. 
    res = value; 
    dynamic dyn = JsonConvert.DeserializeObject(res); 
    var lstInstagramObjects = new List<InstagramModel>(); 

    foreach(var obj in dyn.data) 
    { 
     lstInstagramObjects.Add(new InstagramModel() 
     { 
      Link = (obj.link != null) ? obj.link.ToString() : "", 
      VideoUrl = (obj.videos != null) ? obj.videos.standard_resolution.url.ToString() : "", 
      CommentsCount = int.Parse(obj.comments.count.ToString()), 
      LikesCount = int.Parse(obj.likes.count.ToString()), 
      CreatedTime = new System.DateTime(1970, 1, 1, 0, 0, 0, 0).AddSeconds((double.Parse(obj.created_time.ToString()))), 
      ImageUrl = (obj.images != null) ? obj.images.standard_resolution.url.ToString() : "", 
      User = new InstagramModel.UserAccount() 
        { 
         username = obj.user.username, 
         website = obj.user.website, 
         profile_picture = obj.user.profile_picture, 
         full_name = obj.user.full_name, 
         bio = obj.user.bio, 
         id = obj.user.id, 
        } 
     }); 
    } 

    return Json(lstInstagramObjects, JsonRequestBehavior.AllowGet); 
} 
+0

Một ví dụ về một trường hợp mà điều này hữu ích là khi đối tượng tôi đang cố gắng deserialize vào chứa một thuộc tính đó là một giao diện – soupy1976

12

Newtonsoft.JSON là một giải pháp tốt cho các loại hình tình huống. Ngoài ra Newtonsof.JSON nhanh hơn các loại khác như JavaScriptSerializer, DataContractJsonSerializer.

Trong ví dụ này, bạn có thể như sau:

var jsonData = JObject.Parse("your json data here"); 

Sau đó, bạn có thể cast jsonData để JArray và bạn có thể sử dụng cho vòng lặp để lấy dữ liệu tại mỗi lần lặp. Ngoài ra, tôi muốn thêm một cái gì đó.

for (int i = 0; (JArray)jsonData["data"].Count; i++) 
{ 
    var data = jsonData[i - 1]; 
} 

Làm việc với đối tượng động và sử dụng tuần tự Newton là một lựa chọn tốt.

12

Một cách tuyệt vời để tự động tạo các lớp này cho bạn là để sao chép ra JSON của bạn và ném nó ở đây:

http://json2csharp.com/

Nó sẽ cung cấp cho bạn một điểm khởi đầu để chạm lên lớp học của bạn cho deserialization .

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