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 ?
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 ?
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 :
JsonIgnore
et JsonProperty
peut être ajouté à une classe pour personnaliser la façon dont elle est sérialisée.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);
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;
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());
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...
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 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.