Deserializar el objeto JSON en un objeto dinámico usando Json.net

Resuelto ryudice asked hace 13 años • 9 respuestas

¿Es posible devolver un objeto dinámico desde una deserialización json usando json.net? Me gustaría hacer algo como esto:

dynamic jsonResponse = JsonConvert.Deserialize(json);
Console.WriteLine(jsonResponse.message);
ryudice avatar Dec 27 '10 06:12 ryudice
Aceptado

Json.NET nos permite hacer esto:

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);

Producción:

 1000
 string
 6

Documentación aquí: LINQ to JSON con Json.NET

Véase también JObject.Parse y JArray.Parse

Michael Pakhantsov avatar Jan 23 '2012 13:01 Michael Pakhantsov

A partir de Json.NET 4.0 Versión 1, existe soporte dinámico nativo:

[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>());
}

Y, por supuesto, la mejor manera de obtener la versión actual es a través de NuGet.

Actualizado (12/11/2014) para abordar los comentarios:

Esto funciona perfectamente bien. Si inspecciona el tipo en el depurador verá que el valor es, de hecho, dinámico . El tipo subyacente es un JObject. Si desea controlar el tipo (como especificar ExpandoObject, hágalo).

ingrese la descripción de la imagen aquí

David Peden avatar May 06 '2012 04:05 David Peden

Si simplemente deserializa a dinámico obtendrás un JObject. Puede obtener lo que desea utilizando un ExpandoObject.

var converter = new ExpandoObjectConverter();    
dynamic message = JsonConvert.DeserializeObject<ExpandoObject>(jsonString, converter);
Joshua Peterson avatar Sep 19 '2014 18:09 Joshua Peterson

Sé que esta es una publicación antigua, pero JsonConvert en realidad tiene un método diferente, por lo que sería

var product = new { Name = "", Price = 0 };
var jsonResponse = JsonConvert.DeserializeAnonymousType(json, product);
epitka avatar Feb 12 '2011 21:02 epitka