2010-10-21 8 views
9

Tener un string que contiene los siguientes datos JSON primas (simplificado por el bien de la pregunta):ASP.Net MVC: cómo crear un JsonResult basado en prima de datos JSON

var MyString = "{ 'val': 'apple' }"; 

¿Cómo puedo crear un JsonResult objeto que representa MyString?

Intenté usar el método Json (objeto). pero maneja los datos raw json como una cadena -logicamente: P-. Así que la respuesta HTTP devuelto es así:

"{ 'val': 'apple' }" 

en lugar de los datos en bruto dada JSON:

{ 'val': 'apple' } 

esto es lo que quiero lograr:

Respuesta

21

El método Json() en Controller es en realidad un método de ayuda que crea un nuevo JsonResult. Si miramos the source code for this class*, podemos ver que realmente no está haciendo mucho - simplemente estableciendo el tipo de contenido a application/json, serializando su objeto de datos usando un JavaScriptSerializer, y escribiéndole la cadena resultante ... Puede duplicar este comportamiento (menos la serialización, ya que ya lo hizo) devolviendo un ContentResult desde su controlador en su lugar.

public ActionResult JsonData(int id) { 
    var jsonStringFromSomewhere = "{ 'val': 'apple' }"; 
    // Content() creates a ContentResult just as Json() creates a JsonResult 
    return Content(jsonStringFromSomewhere, "application/json"); 
} 

* A partir de MVC2, JsonResult también se produce una excepción si el usuario está haciendo una petición HTTP GET (en contraposición a decir un POST). Permitir que los usuarios recuperen JSON utilizando un HTTP GET tiene security implications que debe tener en cuenta antes de permitir esto en su propia aplicación.

+2

+1 - pero de acuerdo con http://json.org, las claves y los valores deben estar entre comillas dobles y no solo. –

+0

Buena captura. Acabo de copiar la cadena que utilizó el asker. Por supuesto, toda esta respuesta asume que * sabes * que tu cadena JSON es válida para empezar, por lo que el navegador web del cliente no se atraganta con ella. –

+0

Gracias, Brant. +1 – SDReyes

0

Creo que se puede utilizar el Clase de JavaScriptSerializer para esto

var js = new System.Web.Script.Serialization.JavaScriptSerializer(); 
var jsonObject = js.Deserialize("{ 'val': 'apple' }", typeof(object)); 
+0

¿Funcionaría serializarlo como un objeto? No creo que el serializador agregue propiedades al objeto serializado, creo que solo busca propiedades en el objeto que coincidan con las propiedades en el JSON. ¿Tal vez podrías probar 'dinámico' sin embargo? –

+0

Me funcionó, pero me gusta más la idea de Brant. –

+0

Esto deserializaría el objeto solo para volver a serializarlo. – BJury

1

La manera He generado datos JSON de una cadena es mediante el uso de JavaScriptResult en el controlador:

public JavaScriptResult jsonList(string jsonString) 
{ 
    jsonString = "var jsonobject = new Array(" + jsonString + ");"; 
    return JavaScript(jsonString) 
} 

Entonces, cuando usted solicita pasar la cadena JSON para que la acción en su controlador, el resultado será un archivo con javascript cabeceras.

Cuestiones relacionadas