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?
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
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);
}
Un excellent moyen de générer automatiquement ces classes pour vous est de copier votre sortie JSON et de la jeter ici:
Cela vous fournira un point de départ pour retoucher vos cours en vue de la désérialisation.
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();
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.
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; }
}
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:
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);