Deserializar el objeto JSON en un objeto dinámico usando Json.net
¿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);
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
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).
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);
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);