2011-07-07 36 views
8

Necesito serializar las cadenas de un archivo de recursos (.resx) en un objeto JSON. Las claves del archivo de recursos están en flujo y, por lo tanto, no puedo simplemente crear un objeto C# que acepte los valores apropiados. Necesita ser una solución dinámica. Puedo recorrer los pares clave-valor para el archivo, pero necesito una manera fácil de serializarlos en JSON.¿Cómo crear dinámicamente un objeto JSON en C# (desde un archivo de recursos ASP.NET)?

Sé que podría hacer:

Object thing = new {stringOne = StringResource.stringOne; ...} 

Pero, Prefiero tener algo como:

Object generic = {} 
foreach (DictionaryEntry entry in StringResource) { 
    generic.(entry.Key) = entry.Value 
} 

O debo crear un JSON serializador personalizado que construye el objeto poco a poco (es decir, bucle foreach que agrega parte de la cadena JSON con cada ciclo)?

EDITAR
terminé escribiendo un serializador JSON rápida que construye el campo de cadena a la vez. No quería incluir una biblioteca JSON completa ya que este es el único uso de objetos JSON (al menos por ahora). En última instancia, lo que quería es probablemente poco práctico y no existe, ya que su función está mejor atendida por otras estructuras de datos. ¡Gracias por todas las respuestas!

Respuesta

7

Si está utilizando C# 4.0, debe consultar el mágico System.Dynamic.ExpandoObject.Es un objeto que le permite agregar y eliminar dinámicamente propiedades en tiempo de ejecución, utilizando el nuevo DLR en .NET 4.0. Here es un buen ejemplo de uso para ExpandoObject.

Una vez que tenga su ExpandoObject completamente poblado, probablemente pueda serializarlo fácilmente con cualquiera de las bibliotecas JSON mencionadas por las otras excelentes respuestas.

+0

Esto es lo que estaba buscando, pero también debo poder especificar el nombre de campo dinámicamente (lo sé, requisito impar). Terminé escribiendo un serializador rápido y sucio que hizo el truco, pero esta es la respuesta correcta. –

+0

Parece que puede convertir el ExpandoObject en un 'IDictionary ', y eso le permitirá determinar nombres de campo en tiempo de ejecución. Un ejemplo de eso es en el enlace de MSDN hacia abajo. Pero un serializador personalizado es probablemente igual de bueno. – Phil

+0

Eh, eso es un truco genial, tal vez lo cambie ... –

0

Probablemente usaría JSON.NET y la capacidad de create JSON from XML.

Luego, podría crear un XML en la memoria y dejar que JSON.NET lo convierta a JSON por usted. Quizás si profundizas más en la API, también hay otras opciones.

1

Esto suena como un accidente esperando a suceder (es decir, creando una salida antes de cementar la estructura), pero sucede.

El serializador JSON personalizado es una opción atractiva, ya que le permite pasar fácilmente de su diccionario a un formato JSON. Me gustaría ver las bibliotecas de código abierto (JSON.NET, etc.) para ver si puede reducir el tiempo de desarrollo.

También creo que configurar en un formato ligeramente más estructurado, como XML, es una opción decente. Es bastante fácil serializar de XML a JSON utilizando bibliotecas existentes, por lo que se evita la personalización pesada/

La pregunta más importante es a qué fines servirán en última instancia los datos. Si resuelve este problema utilizando cualquiera de estos métodos, ¿está creando problemas mayores en el futuro?

+0

El objeto JSON actúa como un contenedor simple para transferir cadenas traducidas a un script. –

0

Newtonsoft es una biblioteca que cuenta con todo tipo de herramientas JSON ingeniosas ... entre ellos, sobre la marcha de una línea serializador y deserializadores ... él hacia fuera, es mi favorito de la biblioteca JSON por ahí

http://james.newtonking.com/pages/json-net.aspx

Si no recuerdo mal, tiene una clase que convertirá JSON en un objeto .NET sin tener que crear primero el objeto .NET. Creo que está en la clase Json.Convert

0

La manera de hacerlo es:

var = new serializador System.Web.Script.Serialization.JavaScriptSerializer(); cadena json = serialiser.Serialize (datos); context.Response.Write (json);

Cuestiones relacionadas