Desserialize JSON com c #

Eu estou tentando desserializar uma chamada de API do gráfico de amigos do Facebook em uma lista de objects. O object JSON se parece com:

{"data":[{"id":"518523721","name":"ftyft"}, {"id":"527032438","name":"ftyftyf"}, {"id":"527572047","name":"ftgft"}, {"id":"531141884","name":"ftftft"}, {"id":"532652067","name"... List facebooks = new JavaScriptSerializer().Deserialize<List>(result); 

Não está funcionando porque o object primitivo é inválido.
Como posso desserializar isso?

Você precisa criar uma estrutura como esta:

 public class Friends { public List data {get;set;} } public class FacebookFriend { public string id {get;set;} public string name {get;set;} } 

Então você deveria ser capaz de fazer:

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

Os nomes das minhas aulas são apenas um exemplo. Você deve usar nomes próprios.

Adicionando teste de amostra:

 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(json); foreach(var item in facebookFriends.data) { Console.WriteLine("id: {0}, name: {1}",item.id,item.name); } 

Produz:

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

Às vezes eu prefiro objects dynamics

 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(); 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); } 

muito facilmente podemos analisar json com a ajuda do dictionary e JavaScriptSerializer. Aqui está o código de exemplo pelo qual eu analiso json do arquivo ashx.

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

Uma ótima maneira de gerar essas classs automaticamente para você é copiar sua saída JSON e lançá-la aqui:

http://json2csharp.com/

Ele fornecerá um ponto de partida para retocar suas classs para desserialização.

Eu concordo com Icarus (teria comentado se eu pudesse), mas ao invés de usar uma class CustomObject , eu usaria um Dictionary (no caso de o facebook adicionar algo).

 private class MyFacebookClass { public IList> data { get; set; } } 

ou

 private class MyFacebookClass { public IList> data { get; set; } } 

Newtonsoft.JSON é uma boa solução para este tipo de situações. Também o Newtonsof.JSON é mais rápido do que outros, como JavaScriptSerializer , DataContractJsonSerializer .

Neste exemplo, você pode o seguinte:

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

Então você pode converter jsonData para o JArray e usar o loop para obter dados em cada iteração. Além disso, quero adicionar algo.

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

Trabalhar com objects dynamics e usar o Newtonsoft serialize é uma boa escolha.