2011-11-03 18 views
13

Solo intento crear un tipo anónimo de JSON sin saber nada sobre los parámetros con anticipación e interpretarlos por completo (posiblemente con sugerencias). es decir, ese valor "se ve" como una int, cadena o fecha.¿Cómo deserializar usando JSON.Net a un tipo anónimo?

La única forma que conozco hasta ahora es crear un tipo anónimo del que tenga preconocimiento. Consulte el método .DeserializeAnonymousType (...) a continuación.

¿Alguien puede hacer algo mejor que esto? Gracias.

 var jsonString = "{\"user_id\": 1, \"user_type\": \"moderator\", \"name\": \"Fred\"}"; 

     JToken root = JObject.Parse(jsonString); 

     var anonTemplate = new{user_id=0, user_type="", name="" }; 

     var a = JsonConvert.DeserializeAnonymousType(root.ToString(), anonTemplate); 


     var b = JsonConvert.DeserializeObject<Object>(root.ToString()); // actually turns into a JsonObject which is something differet. 

actualización

He descargado dynamicduck y estoy jugando con él un poco. ¿Será esta extraña idea dinámica de "envoltura" de la capacidad de Brian de la manera que necesito (serializable, etc.)?

http://weblogs.asp.net/britchie/archive/2010/08/05/json-net-dynamic-extensions.aspx

http://weblogs.asp.net/britchie/archive/2010/08/03/dynamicduck-duck-typing-in-a-dynamic-world.aspx

+0

En caso de .NET 4 supongo que debe poder deserializar el objeto 'dynamic' y luego acceder explícitamente a las propiedades requeridas – sll

+2

¿Cómo piensa consumir este objeto si no sabe qué parámetros tiene o se espera que haga? ¿tener? – KallDrexx

+0

@sll: tengo un ejemplo? No contra tipos dinámicos Los estoy usando en alguna ocasión. En ese caso, mi siguiente pregunta sería cómo convertir de dinámico a un tipo anon. Estoy contento con cualquiera de las rutas porque el rendimiento no es un problema, sin embargo, * I * do * necesito un tipo anon en este caso (bibliotecas existentes). – sgtz

Respuesta

6

Usted puede deserializar con JSON.NET a un ExpandoObject utilizando el ExpandoObjectConverter.

Para crear un tipo anónimo en tiempo de ejecución, es bastante un poco más complicado, echar un vistazo a los aros saltaron a través de este hilo:

How to create LINQ Expression Tree to select an anonymous type

Como se puede ver un poco de esfuerzo que probablemente no valga la pena ya que aún no obtendría ninguna seguridad en tiempo de compilación. Entonces, un dynamic o un ExpandoObject son sus mejores apuestas.

+1

¿tiene un ejemplo de uso de ExpandoObjectConverter que podría vincular? – sgtz

Cuestiones relacionadas