2011-10-25 6 views
157

J'essaie de désérialiser un appel d'API de graphe d'amis Facebook dans une liste d'objets. L'objet JSON ressemble à:Désérialise JSON avec 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); 

Cela ne fonctionne pas car l'objet primitif n'est pas valide.
Comment est-ce que je peux désérialiser cela?

+1

écrire un désérialiseur personnalisé spécifiquement pour répondre à ce genre de ... –

+1

ou vous pouvez utiliser un dictionnaire ', consultez: http://stackoverflow.com/questions/7699972/how-to-decode-a-json-string-using-c/7701070#7701070 – Kakashi

+3

Votre ami: http://json2csharp.com/ – nawfal

Répondre

204

Vous devez créer une structure comme celle-ci:

public class Friends 
{ 

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

public class FacebookFriend 
{ 

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

alors vous devriez être en mesure de le faire:

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

noms de mes cours ne sont qu'un exemple. Vous devriez utiliser des noms propres.

Ajout test de l'échantillon:

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

Produit:

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

Yeh, c'est ce que je ne vouloir faire, créer un nouvel objet pour contenir les enfants. Je pense que je vais soustraire le json qui prend l'objet primitif. Je vous remercie. –

+0

@Kevin Holditch merci pour la correction. J'ai manqué un bit important :) – Icarus

+0

result.Substring (8, result.Length - 9) faire le travail. Laide, mais ... –

14

Je suis d'accord avec Icarus (aurait commenté si je pouvais), mais au lieu d'utiliser une classe CustomObject , I utiliserait un Dictionnaire (dans le cas où facebook ajoute quelque chose).

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

ou

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

L'utilisation dynamique fonctionne mieux dans les nouvelles versions. 'public IList > data {get; ensemble; } ' – BJury

23

très facilement nous pouvons analyser JSON avec l'aide du dictionnaire et JavaScriptSerializer. Voici l'exemple de code par lequel j'analyse json à partir du fichier 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

Cette solution est très utile si vous n'avez pas le temps ou le besoin de créer des contrats de données. Surtout si vous êtes intéressé par seulement quelques attributs enfouis profondément dans la structure JSON. Dans cette situation, vous pouvez utiliser une série d'instructions pour naviguer vers ce dont vous avez besoin. Remarque: le type à désérialiser peut également être l'un des suivants: Dictionary ou ArrayList (lorsqu'un noeud a une structure répétitive). –

+1

Je reçois une exception d'exécution avec ceci: Aucun constructeur sans paramètre défini pour le type de 'System.String' sur la ligne de code Deserialize. –

36

Parfois, je préfère des objets dynamiques

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

Un exemple d'une instance où cela était utile était quand l'objet que j'essayais de désérialiser contenait une propriété qui était une interface – soupy1976

12

Newtonsoft.JSON est une bonne solution pour ce genre de situations. Aussi Newtonsof.JSON est plus rapide que d'autres tels que JavaScriptSerializer, DataContractJsonSerializer.

Dans cet exemple, vous pouvez les éléments suivants:

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

Ensuite, vous pouvez lancer jsonData à JArray et vous pouvez utiliser la boucle pour obtenir des données à chaque itération. Aussi, je veux ajouter quelque chose.

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

Travailler avec un objet dynamique et utiliser Newtonsoft sérialiser est un bon choix.

12

Une excellente façon de générer automatiquement ces classes pour vous est de copier votre JSON et de le jeter ici:

http://json2csharp.com/

Il vous fournira un point de départ pour toucher vos cours pour désérialisation .

Questions connexes