web-dev-qa-db-fra.com

Désérialiser JSON avec C #

J'essaie de désérialiser un appel d'API graphique d'amis Facebook dans 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 est invalide.
Comment puis-je désérialiser cela?

195
user989818

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

Ensuite, vous devriez pouvoir faire:

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

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

Ajout d'un échantillon de test:

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
246
Icarus

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);
}
47
Bishoy Hanna

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

http://json2csharp.com/

Cela vous fournira un point de départ pour retoucher vos cours en vue de la désérialisation.

28
Jack Fairfield

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

Newtonsoft.JSON est une bonne solution pour ce genre de situation. De plus, Newtonsof.JSON est plus rapide que d’autres, comme JavaScriptSerializer, DataContractJsonSerializer.

Dans cet exemple, vous pouvez:

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

Ensuite, vous pouvez convertir jsonData en JArray et vous pouvez utiliser la boucle for 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.

17
OnurBulbul

Je suis d'accord avec Icarus (aurait commenté si je pouvais), mais au lieu d'utiliser une classe CustomObject, j'utiliserais un Dictionnaire (au 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; }
}
14
Stijn Bollen

Voici un autre site qui vous aidera avec tout le code dont vous avez besoin tant que vous avez une chaîne JSON correctement formatée disponible:

https://app.quicktype.io/

0
Liknes

Sérialisation:

// Convert object to JOSN string format  
string jsonData = JsonConvert.SerializeObject(obj);  

Response.Write(jsonData);  

désérialisation::

Désérialiser un objet dynamique

  string json = @"{  
      'Name': 'name',  
      'Description': 'des'  
    }";  

var res = JsonConvert.DeserializeObject< dynamic>(json);  

Response.Write(res.Name);
0
ravula sandeep