239 votes

Désérialiser JSON avec C#

J'essaie de désérialiser les données d'un ami Facebook. API graphique en une liste d'objets. L'objet JSON ressemble à :

{"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 puis-je le désérialiser ?

293voto

Icarus Points 36951

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 capable de le faire :

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

Les noms de mes classes ne sont qu'un exemple. Vous devriez utiliser des noms appropriés.

Ajout d'un test type :

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

59voto

Bishoy Hanna Points 901

Parfois, je préfère les 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);
}

50voto

Jack Fairfield Points 696

Un excellent moyen de générer automatiquement ces classes pour vous est de copier votre sortie JSON et de la placer ici :

http://json2csharp.com/

Il vous fournira un point de départ pour retoucher vos classes pour la désérialisation.

32voto

Thomas Points 6809

Nous pouvons très facilement analyser le contenu JSON à l'aide d'un dictionnaire et de JavaScriptSerializer. Voici un exemple de code permettant d'analyser le contenu JSON d'un 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();

25voto

OnurBulbul Points 319

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

Dans cet exemple, vous pouvez faire ce qui suit :

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

Vous pouvez alors convertir jsonData en JArray et vous pouvez utiliser un for 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 serialize est un bon choix.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X