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.Prop
nom 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' string
art. David le montre dans la capture d'écran du bas. Le JValue
est 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"]);
JsonConvert
ne 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>();