Est-il possible de renvoyer un objet dynamique d'une désérialisation json en utilisant json.net? Je voudrais faire quelque chose comme ça:
dynamic jsonResponse = JsonConvert.Deserialize(json);
Console.WriteLine(jsonResponse.message);
Est-il possible de renvoyer un objet dynamique d'une désérialisation json en utilisant json.net? Je voudrais faire quelque chose comme ça:
dynamic jsonResponse = JsonConvert.Deserialize(json);
Console.WriteLine(jsonResponse.message);
Réponses:
Json.NET nous 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);
Production:
1000
string
6
Documentation ici: LINQ to JSON avec Json.NET
Voir aussi JObject.Parse et JArray.Parse
JArray.Parse.
Dim d As Object = JObject.Parse("{number:1000, str:'string', array: [1,2,3,4,5,6]}")
Depuis Json.NET 4.0 Release 1, il existe une prise en charge dynamique native:
[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.
Mis à 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 a JObject. Si vous souhaitez contrôler le type (comme spécifier ExpandoObject, faites-le.

@Model.Propnom dans Razor si le type de retour est JValue.
JValue. Ce qui m'a dérouté parce que je travaillais dans le débogueur / fenêtre immédiate et que je ne voyais pas seulement l' stringart. David le montre dans la capture d'écran du bas. Le JValueest convertible pour que vous puissiez le fairestring m = jsonResponse.message
Si vous venez de désérialiser en dynamique, vous obtiendrez un JObject. Vous pouvez obtenir ce que vous voulez en utilisant un ExpandoObject.
var converter = new ExpandoObjectConverter();
dynamic message = JsonConvert.DeserializeObject<ExpandoObject>(jsonString, converter);
Je sais que c'est un ancien poste, 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 à l'aide de JsonConvert.DeserializeObject. Pour ce faire, il suffit de faire simplement:
dynamic jsonResponse = JsonConvert.DeserializeObject(json);
Console.WriteLine(jsonResponse["message"]);
JsonConvertne contient pas de méthode appelée Deserialize.
Remarque: 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 a permis de désérialiser sans avoir à définir la classe réelle et a permis qu'une classe anonyme soit utilisée pour effectuer 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 vers les types anonymes est ici:
Si vous utilisez JSON.NET avec une ancienne version qui n'a pas JObject.
C'est une autre façon simple de créer un objet dynamique à partir de JSON: https://github.com/chsword/jdynamic
Installation de NuGet
PM> Install-Package JDynamic
Prise en charge de l'utilisation de l'index de chaîne pour accéder aux membres comme:
dynamic json = new JDynamic("{a:{a:1}}");
Assert.AreEqual(1, json["a"]["a"]);
Cas de test
Et vous pouvez utiliser cet util comme suit:
Obtenez la valeur directement
dynamic json = new JDynamic("1");
//json.Value
Obtention du membre dans l'objet json
dynamic json = new JDynamic("{a:'abc'}");
//json.a is a string "abc"
dynamic json = new JDynamic("{a:3.1416}");
//json.a is 3.1416m
dynamic json = new JDynamic("{a:1}");
//json.a is integer: 1
3.Inombrable
dynamic json = new JDynamic("[1,2,3]");
/json.Length/json.Count is 3
//And you can use json[0]/ json[2] to get the elements
dynamic json = new JDynamic("{a:[1,2,3]}");
//json.a.Length /json.a.Count is 3.
//And you can use json.a[0]/ json.a[2] to get the elements
dynamic json = new JDynamic("[{b:1},{c:1}]");
//json.Length/json.Count is 2.
//And you can use the json[0].b/json[1].c to get the num.
Autre
dynamic json = new JDynamic("{a:{a:1} }");
//json.a.a is 1.
Oui c'est possible. Je le fais depuis toujours.
dynamic Obj = JsonConvert.DeserializeObject(<your json string>);
C'est un peu plus délicat pour le type non natif. Supposons qu'à l'intérieur de votre Obj, il y ait des objets ClassA et ClassB. Ils sont tous convertis en JObject. Ce que vous devez faire, c'est:
ClassA ObjA = Obj.ObjA.ToObject<ClassA>();
ClassB ObjB = Obj.ObjB.ToObject<ClassB>();