¿Es posible devolver un objeto dinámico de una deserialización de json usando json.net? Me gustaría hacer algo como esto:
dynamic jsonResponse = JsonConvert.Deserialize(json);
Console.WriteLine(jsonResponse.message);
¿Es posible devolver un objeto dinámico de una deserialización de json usando json.net? Me gustaría hacer algo como esto:
dynamic jsonResponse = JsonConvert.Deserialize(json);
Console.WriteLine(jsonResponse.message);
Respuestas:
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);
Salida:
1000
string
6
Documentación aquí: LINQ to JSON con Json.NET
Ver también JObject.Parse y JArray.Parse
JArray.Parse
.
Dim d As Object = JObject.Parse("{number:1000, str:'string', array: [1,2,3,4,5,6]}")
A partir de Json.NET 4.0 Release 1, hay 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 a JObject
. Si desea controlar el tipo (como especificar ExpandoObject
, hágalo).
@Model.Prop
nombre en Razor si el tipo de retorno es JValue.
JValue
. Lo que me confundió porque estaba trabajando en el depurador / ventana inmediata y no estaba viendo solo string
s. David muestra esto en la captura de pantalla inferior. El JValue
es convertible, así que puedes hacerlostring m = jsonResponse.message
Si solo se deserializa a dinámico, obtendrá un JObject de regreso. Puede obtener lo que desea usando 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);
Sí, puede hacerlo utilizando JsonConvert.DeserializeObject. Para hacer eso, simplemente hazlo:
dynamic jsonResponse = JsonConvert.DeserializeObject(json);
Console.WriteLine(jsonResponse["message"]);
JsonConvert
no contiene un método llamado Deserialize
.
Nota: En el momento en que respondí esta pregunta en 2010, no había forma de deserializar sin algún tipo de tipo, esto le permitió deserializar sin tener que definir la clase real y permitió que se usara una clase anónima para hacer la deserialización.
Necesitas tener algún tipo de tipo para deserializar. Podrías hacer algo en la línea de:
var product = new { Name = "", Price = 0 };
dynamic jsonResponse = JsonConvert.Deserialize(json, product.GetType());
Mi respuesta se basa en una solución para la compilación de .NET 4.0 en el serializador JSON. El enlace para deserializar a tipos anónimos está aquí:
Si usa JSON.NET con una versión anterior que no JObject.
Esta es otra forma simple de hacer un objeto dinámico desde JSON: https://github.com/chsword/jdynamic
Instalar NuGet
PM> Install-Package JDynamic
Admite el uso de índice de cadena para acceder a miembros como:
dynamic json = new JDynamic("{a:{a:1}}");
Assert.AreEqual(1, json["a"]["a"]);
Caso de prueba
Y puede usar esta utilidad de la siguiente manera:
Obtenga el valor directamente
dynamic json = new JDynamic("1");
//json.Value
2. Obtenga el miembro en el objeto 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 innumerable
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.
Otro
dynamic json = new JDynamic("{a:{a:1} }");
//json.a.a is 1.
Sí, es posible. He estado haciendo eso todo el tiempo.
dynamic Obj = JsonConvert.DeserializeObject(<your json string>);
Es un poco más complicado para el tipo no nativo. Supongamos que dentro de su Obj, hay un objeto ClassA y ClassB. Todos se convierten a JObject. Lo que debes hacer es:
ClassA ObjA = Obj.ObjA.ToObject<ClassA>();
ClassB ObjB = Obj.ObjB.ToObject<ClassB>();