newtonsoft - C#- Deserializar JSON a objeto anónimo
recorrer json en c# (5)
En C #, he serializado con éxito un objeto anónimo en JSON mediante el uso de un código como este ...
var obj = new { Amount = 108, Message = "Hello" };
JavaScriptSerializer serializer = new JavaScriptSerializer();
String output = serializer.Serialize(obj);
Sin embargo, lo que me gustaría poder hacer más tarde es deserializar la cadena JSON en un objeto anónimo. Algo como esto...
var obj2 = serializer.Deserialize(output, object);
Pero el método serializer.Deserialize () requiere un segundo parámetro que es el tipo de objeto al que se deserializará.
Intenté esto ...
var obj2 = serializer.Deserialize(output, obj.GetType());
Pero esto produce un error:
No se ha definido ningún constructor sin parámetros para el tipo de ''<> f__AnonymousType0`2 [[System.Int32, mscorlib, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089], [System.String, mscorlib, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089]] ''.
No estoy seguro de lo que significa este error.
¿qué hay de la dinámica, la forma más rápida que veo es esta:
dynamic myObject = JsonConvert.DeserializeObject<dynamic>(output);
decimal Amount = Convert.ToDecimal(myObject.Amount);
string Message = myObject.Message;
Nota: Necesitará la referencia de Newtonsoft.json.dll
En cuanto al uso del método DeserializeObject , no requiere un tipo específico. Esto también resolvió una pregunta similar de SO . El método se deserializa a un Dictionary<string, object>
contiene pares de nombre / valor.
Actualización : para aclarar el error que se obtiene al hacer esto:
var obj2 = serializer.Deserialize(output, obj.GetType());
Dado el tipo de obj
, Deserialize
intentará crear una nueva instancia del tipo utilizando un constructor predeterminado. Los tipos anónimos en C # no tienen un constructor público sin parámetros y, por lo tanto, la operación falla.
Esto también se puede hacer usando el JavaScriptSerializer incorporado, de la siguiente manera:
object result = new JavaScriptSerializer().DeserializeObject(JSONData);
Esto devolverá una instancia de object [], con pares Key-Value.
Recientemente he estado usando la increíble JsonFX y he llegado a apreciar lo que hace. Puede usar Nuget Package Manager para instalarlo directamente dentro de Visual Studio.
El código va así.
class DataTransferObject
{
int Amount { get; set; }
string Message { get; set; }
}
Como puede ver, incluso puede especificar la plantilla para Tipo Anónimo.
JSON.Net es una biblioteca poderosa para trabajar con JSON en .Net
Hay un método DeserializeAnonymousType que puede tocar.
Actualización : Json.Net ahora se incluye con ASP.Net, sin embargo, mi último favorito que uso es JsonFX . Tiene un gran soporte de linq también, échale un vistazo.
Actualización 2 : He pasado de JsonFX, y actualmente uso ServiceStack.Text , ¡es rápido!