2010-06-01 17 views
9

La respuesta a casi todas las preguntas sobre el uso de C# con JSON parece ser "usar JSON.NET", pero esa no es la respuesta que estoy buscando.Confundido acerca de cómo usar JSON en C#

La razón por la que digo esto es, de todo lo que he podido leer en la documentación, JSON.NET es básicamente una versión de mejor desempeño de la DataContractSerializer integrado en el marco .NET ...

Lo que significa que si quiero deserializar una cadena JSON, tengo que definir la clase completa, fuertemente tipada para CADA petición que pueda tener. Entonces, si necesito obtener categorías, publicaciones, autores, etiquetas, etc., tengo que definir una nueva clase para cada una de estas cosas.

Esto está bien si construí el cliente y sé exactamente cuáles son los campos, pero estoy usando la API de otra persona, así que no tengo idea de lo que es el contrato a menos que descargue una cadena de respuesta de muestra y cree la clase manualmente de la cadena JSON.

¿Es esa la única forma en que se hace? ¿No hay una forma de crear un tipo de hashtable que se pueda leer con json ["propertyname"]?

Finalmente, si tengo que crear las clases yo mismo, ¿qué sucede cuando la API cambia y no me dicen (como Twitter parece ser notorio por hacer)? Supongo que todo mi proyecto se romperá hasta que entre y actualice las propiedades del objeto ...

¿Cuál es exactamente el flujo de trabajo general cuando se trabaja con JSON? Y por general me refiero a agnóstico de la biblioteca. Quiero saber cómo se hace en general, no específicamente a una biblioteca de destino ...

+0

Además, ¿existe una herramienta para automatizar la implementación de estos Contratos de Datos basados ​​en una cadena JSON? algunas apis tienen DOZENS de tipos de devolución y sería una locura intentar hacerlas todas ... – SelAromDotNet

Respuesta

5

Es muy difícil ser independiente de la biblioteca a medida que lo solicita porque la forma en que trabaja con json realmente depende de la biblioteca que utiliza. Como ejemplo dentro de JSON.NET hay varias maneras en que podría trabajar con JSON. Existe el método del que habla con serialización directa en objetos. Eso es seguro, pero se romperá si cambian los datos de tu API. Sin embargo, también hay un LINQ-a-JSON que proporciona un JObject (que se comporta de manera similar a XElement) que proporciona una forma de hacer JObject ["key"] como lo solicitó en su pregunta. Si realmente está buscando una forma flexible de trabajar con JSON dentro de C#, entonces consulte LINQ-to-JSON de JSON.NET.

En realidad, no importa cómo lo hagas, si la API cambia tu código es probable que se rompa. Incluso si solo es estrictamente un enfoque basado en hashtable, su código aún se romperá si cambian los datos.

Editar

JSON.NET Documentation

Examples

Si se echa un vistazo a los ejemplos, el segundo uno debería darle un buen ejemplo de cómo funciona LINQ a JSON. Le permite trabajar con él sin definir ninguna clase. Todo se convierte en clases de marco estándar (principalmente colecciones y cadenas). Esto evita la necesidad de mantener clases.

+0

¡gracias por tu respuesta! ¿tiene json.net alguna herramienta para simplificar el desarrollo de estos contratos? algunas apis tienen docenas de objetos devueltos y sería un dolor tener que escribirlos todos, especialmente si estoy usando esto para acceder a múltiples API de diferentes proveedores ... – SelAromDotNet

+0

Con las cosas de JSON.NET Linq no tienes para definir los objetos de retorno explícitamente Usted trabaja con JSON a través de matrices, en gran medida como lo haría en JavaScript. Respuesta actualizada con algunos enlaces. – Stephan

+0

ahh el enlace Ejemplos parece exactamente lo que estoy buscando, ¡gracias de nuevo! una última pregunta, entonces, si decido que quiero trabajar con objetos fuertemente tipados después de todo, ¿estoy limitado a derivar mis clases manualmente mediante la asignación de un ejemplo devuelto cadena JSON? es decir, ¿tendría que emitir una solicitud, obtener la cadena JSON de retorno, abrirla en el bloc de notas y crear la clase yo mismo desde los campos que veo en la cadena? o hay algún tipo de herramienta para ayudar a automatizar esto? ¡gracias de nuevo! – SelAromDotNet

0

He sido desarrollador de Perl por más de una década, y recientemente comencé a trabajar en C#. Me sorprende lo mucho que me gusta (no me gusta Java), pero uno de los cambios cognitivos más difíciles va desde "Todo se puede tratar como una cadena y el lenguaje se ocupa de las conversiones" hasta "Pre -definir tus tipos ". En este caso, pensar en cadenas puede ser una ventaja, porque es lo que necesita hacer para el tipo de API que está solicitando.

Necesita escribir un analizador JSON que comprenda the syntax, que es bastante simple: listas separadas por comas, pares clave/valor, {} para hashes/objects, [] para matrices, y construcciones de comillas/de escape. Querrá crear una Hashtable para comenzar porque la entidad de nivel superior en JSON es siempre un objeto, luego escanea la cadena JSON carácter por carácter. Tire de los pares de clave/valor; si el valor comienza con {luego, agréguelo como una nueva tabla Hash, si comienza con [agréguelo como una nueva ArrayList, de lo contrario agréguelo como una cadena. Si obtiene {o [tendrá que descender recursivamente para agregar los elementos de datos secundarios.

Si .NET tiene un buen analizador de descenso recursivo, probablemente podría usarlo para hacer el trabajo más simple o más robusto, pero JSON es lo suficientemente simple como para que sea un ejercicio bueno y razonablemente completable.

+0

Como Stephen señala en su respuesta, este enfoque está bien siempre y cuando no dependa de las claves/valores particulares en uso. Por ejemplo, si solo estuviera visualizando la estructura de datos JSON, no necesita un conocimiento a priori de las claves. Sin embargo, si su aplicación va a codificar los nombres de las teclas, está vinculado a la API del servicio y puede romperse si la API cambia. Dicho esto, el enfoque basado en cadenas es más robusto que un sistema típico fuertemente tipado. Las interfaces fuertemente tipadas como esta típicamente no pueden manejar ningún cambio en absoluto, mientras que un sistema basado en cadenas estará bien con, por ejemplo: claves nuevas – DougWebb

Cuestiones relacionadas