c# - Désérialise un objet json en objet dynamique à l'aide de Json.net




(6)

À partir de Json.NET 4.0 Release 1, il existe un support dynamique natif:

[Test]
public void DynamicDeserialization()
{
    dynamic jsonResponse = JsonConvert.DeserializeObject("{\"message\":\"Hi\"}");
    jsonResponse.Works = true;
    Console.WriteLine(jsonResponse.message); // Hi
    Console.WriteLine(jsonResponse.Works); // True
    Console.WriteLine(JsonConvert.SerializeObject(jsonResponse)); // {"message":"Hi","Works":true}
    Assert.That(jsonResponse, Is.InstanceOf<dynamic>());
    Assert.That(jsonResponse, Is.TypeOf<JObject>());
}

Et, bien sûr, la meilleure façon d'obtenir la version actuelle est via NuGet.

Mise à jour (11/12/2014) pour répondre aux commentaires:

Cela fonctionne parfaitement bien. Si vous inspectez le type dans le débogueur, vous verrez que la valeur est, en fait, dynamique . Le type sous-jacent est un JObject . Si vous voulez contrôler le type (comme spécifier ExpandoObject , alors faites-le.

Est-il possible de renvoyer un objet dynamique à partir d'une désérialisation json en utilisant json.net? Je voudrais faire quelque chose comme ceci:

dynamic jsonResponse = JsonConvert.Deserialize(json);
Console.WriteLine(jsonResponse.message);

Je sais que c'est un vieux post mais JsonConvert a en fait une méthode différente donc ce serait

var product = new { Name = "", Price = 0 };
var jsonResponse = JsonConvert.DeserializeAnonymousType(json, product);

Oui, vous pouvez le faire en utilisant JsonConvert.DeserializeObject. Pour ce faire, simplement faire:

dynamic jsonResponse = JsonConvert.DeserializeObject(json);
Console.WriteLine(jsonResponse["message"]);

Si vous désérialisez simplement en dynamique, vous récupérerez un objet JObject. Vous pouvez obtenir ce que vous voulez en utilisant un ExpandoObject.

var converter = new ExpandoObjectConverter();    
dynamic message = JsonConvert.DeserializeObject<ExpandoObject>(jsonString, converter);

dernière version de json.net permet de faire ceci:

dynamic d = JObject.Parse("{number:1000, str:'string', array: [1,2,3,4,5,6]}");

Console.WriteLine(d.number);
Console.WriteLine(d.str);
Console.WriteLine(d.array.Count);

sortie:

 1000
 string
 6

Documentation ici: LINQ to JSON avec Json.NET


Note: Au moment où j'ai répondu à cette question en 2010, il n'y avait aucun moyen de désérialiser sans une sorte de type, cela vous permettait de désérialiser sans avoir à définir la classe réelle et d'utiliser une classe anonyme pour faire la désérialisation.

Vous devez avoir une sorte de type à désérialiser. Vous pourriez faire quelque chose comme:

var product = new { Name = "", Price = 0 };
dynamic jsonResponse = JsonConvert.Deserialize(json, product.GetType());

Ma réponse est basée sur une solution pour la construction de .NET 4.0 dans le sérialiseur JSON. Le lien pour désérialiser en types anonymes est ici:

http://blogs.msdn.com/b/alexghi/archive/2008/12/22/using-anonymous-types-to-deserialize-json-data.aspx





json.net