563 votes

Comment analyser JSON avec C# ?

J'ai le code suivant :

var user = (Dictionary<string, object>)serializer.DeserializeObject(responsecontent);

L'entrée dans responsecontent est JSON, mais il n'est pas correctement analysé en objet. Comment dois-je le désérialiser correctement ?

436voto

Sayem Ahmed Points 11839

Je suppose que vous n'utilisez pas Json.NET (paquet NuGet Newtonsoft.Json). Si c'est le cas, vous devriez l'essayer.

Il présente les caractéristiques suivantes :

  1. LINQ à JSON
  2. Le JsonSerializer pour convertir rapidement vos objets .NET en JSON et inversement.
  3. Json.NET peut éventuellement produire du JSON bien formaté et indenté pour le débogage ou l'affichage.
  4. Des attributs comme JsonIgnore et JsonProperty peut être ajouté à une classe pour personnaliser la façon dont elle est sérialisée.
  5. Possibilité de convertir JSON en XML et vice-versa.
  6. Prise en charge de plusieurs plates-formes : .NET, Silverlight et le Compact Framework

Regardez le exemple ci-dessous. Dans cet exemple, JsonConvert est utilisée pour convertir un objet depuis et vers JSON. Elle possède deux méthodes statiques à cet effet. Elles sont SerializeObject(Object obj) et DeserializeObject<T>(String json) :

Product product = new Product();
product.Name = "Apple";
product.Expiry = new DateTime(2008, 12, 28);
product.Price = 3.99M;
product.Sizes = new string[] { "Small", "Medium", "Large" };

string json = JsonConvert.SerializeObject(product);
//{
//  "Name": "Apple",
//  "Expiry": "2008-12-28T00:00:00",
//  "Price": 3.99,
//  "Sizes": [
//    "Small",
//    "Medium",
//    "Large"
//  ]
//}

Product deserializedProduct = JsonConvert.DeserializeObject<Product>(json);

370voto

Dmitry Pavlov Points 2260

Comme il a été répondu ici - Désérialiser JSON en objet dynamique C# ?

C'est assez simple en utilisant Json.NET :

dynamic stuff = JsonConvert.DeserializeObject("{ 'Name': 'Jon Smith', 'Address': { 'City': 'New York', 'State': 'NY' }, 'Age': 42 }");

string name = stuff.Name;
string address = stuff.Address.City;

Ou en utilisant Newtonsoft.Json.Linq :

dynamic stuff = JObject.Parse("{ 'Name': 'Jon Smith', 'Address': { 'City': 'New York', 'State': 'NY' }, 'Age': 42 }");

string name = stuff.Name;
string address = stuff.Address.City;

157voto

qqbenq Points 1801

Voici quelques options sans en utilisant des bibliothèques tierces :

// For that you will need to add reference to System.Runtime.Serialization
var jsonReader = JsonReaderWriterFactory.CreateJsonReader(Encoding.UTF8.GetBytes(@"{ ""Name"": ""Jon Smith"", ""Address"": { ""City"": ""New York"", ""State"": ""NY"" }, ""Age"": 42 }"), new System.Xml.XmlDictionaryReaderQuotas());

// For that you will need to add reference to System.Xml and System.Xml.Linq
var root = XElement.Load(jsonReader);
Console.WriteLine(root.XPathSelectElement("//Name").Value);
Console.WriteLine(root.XPathSelectElement("//Address/State").Value);

// For that you will need to add reference to System.Web.Helpers
dynamic json = System.Web.Helpers.Json.Decode(@"{ ""Name"": ""Jon Smith"", ""Address"": { ""City"": ""New York"", ""State"": ""NY"" }, ""Age"": 42 }");
Console.WriteLine(json.Name);
Console.WriteLine(json.Address.State);

Voir le lien pour plus d'informations sur System.Web.Helpers.Json .

Mise à jour : De nos jours, le moyen le plus simple d'obtenir le Web.Helpers est d'utiliser le Paquet NuGet .


Si vous ne vous préoccupez pas des versions antérieures de Windows, vous pouvez utiliser les classes de l'application Windows.Data.Json espace de noms :

// minimum supported version: Win 8
JsonObject root = Windows.Data.Json.JsonValue.Parse(jsonString).GetObject();
Console.WriteLine(root["Name"].GetString());
Console.WriteLine(root["Address"].GetObject()["State"].GetString());

66voto

ElonU Webdev Points 1499

Si .NET 4 est disponible pour vous, consultez le site : http://visitmix.com/writings/the-rise-of-json (archive.org)

Voici un extrait de ce site :

WebClient webClient = new WebClient();
dynamic result = JsonValue.Parse(webClient.DownloadString("https://api.foursquare.com/v2/users/self?oauth_token=XXXXXXX"));
Console.WriteLine(result.response.user.firstName);

Cette dernière Console.WriteLine est plutôt sympa...

45voto

fr34kyn01535 Points 459

Une autre solution native, qui ne nécessite aucune bibliothèque tierce mais une référence à System.Web.Extensions est le JavaScriptSerializer. Il ne s'agit pas d'une nouveauté mais d'une fonctionnalité intégrée très peu connue depuis la version 3.5.

using System.Web.Script.Serialization;

..

JavaScriptSerializer serializer = new JavaScriptSerializer();
objectString = serializer.Serialize(new MyObject());

et retour

MyObject o = serializer.Deserialize<MyObject>(objectString)

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