2011-08-12 63 views
11

Quiero serializar el objeto dinámico a JSON. He intentado utilizar ExpandoObject, pero el resultado no es lo que necesito:¿Cómo puedo serializar el objeto dinámico a JSON en la acción del controlador C# MVC?

public JsonResult Edit() 
{ 
    dynamic o = new ExpandoObject(); 
    ((IDictionary<string,Object>)o)["abc"] = "ABC"; //or o.abc = "ABC"; 
    return Json(o); 
} 

Quiero JSON para que parezca: { "abc": "ABC"} pero en cambio, parece que [{ "clave": "abc "," Valor ":" ABC "}] Obviamente, ExpandoObject no funcionará, pero ¿puedo heredar de DynamicObject y anular de algún modo sus métodos para lograr el formato JSON que deseo?

+1

respuesta es aplanar según: http://stackoverflow.com/questions/5156664/how-to-flatten-an-expandoobject-returned-via-jsonresult-in-asp-net-mvc – Joe

+0

@ JoeTuskan por cierto vale la pena votar para cerrar cosas como esta –

Respuesta

1

Esto le devolverá lo que desee.

public JsonResult Edit() 
{ 
    return Json(new {abc = "ABC"}); 
} 
+3

Esta es una clase con propiedad abc. Quiero que la clase tenga propiedades agregadas en tiempo de ejecución. – panpawel

3

Esto puede no ser útil para usted, pero yo tenía un requisito similar, sino que se utiliza un SerializableDynamicObject

he cambiado el nombre del diccionario de "campos" y entonces este serializa con Json.Net a producir JSON que se parece a: propiedades

{"Fields":{"Property1":"Value1", "Property2":"Value2" etc. 

donde se agregan dinámicamente Propiedad1 y Propiedad2 - es decir Claves de diccionario

sería perfec t si pudiera deshacerme de la propiedad adicional "Campos" que encapsula el resto, pero he solucionado esa limitación.

+1

¿Puede pasar esto a http://stackoverflow.com/questions/5156664/how-to-flatten-an-expandoobject-returned-via-jsonresult-in-asp-net-mvc y VTC esto por favor? Incluso lanzaré un +1 en el trato: D –

+1

hecho - movido y VTC – BonyT

0

Siempre puede serializar una HashTable, no es dinámica pero admite pares de valores de clave de objeto.

0

Esto funcionó perfectamente para mí. Tienes que usar Json.NET.

[HttpGet] 
    public string GetJson() 
    { 
     List<Dictionary<string, string>> list = new List<Dictionary<string, string>>(); 

     List<DataEntry> properties = new List<DataEntry>(); 

     for (int i = 0; i < 10; i++) 
     { 
      properties.Add(new DataEntry { Column = "column" + i.ToString(), Value = "value" + i.ToString() }); 
     } 

     list.Add(properties.ToDictionary(x => x.Column, y => y.Value)); 
     string test = JsonConvert.SerializeObject(list); 

     return test; 
    } 
3

tenía este mismo problema y terminó fijándolo mediante el serializador JSON.net (Newtonsoft.Json) en lugar de utilizar el resultado JsonContent. A continuación, serializó mis objetos dinámicos con propiedades normales frente a la lista extraña "clave" de "valor".

//In my usage I had a list of dynamic objects 
var output = new List<dynamic>(); 

//Change this 
return JsonContent(new {Error = errorMessage, Results = output}); 

//to this 
return Content(JsonConvert.SerializeObject(new {Error = errorMessage, Results = output})); 
+0

Por favor, considere copiar su respuesta a http://stackoverflow.com/questions/5156664/how-to-flatten-an-expandoobject-returned -via-jsonresult-in-asp-net-mvc – ProfNimrod

Cuestiones relacionadas