2010-12-06 17 views
7

Tengo un dictionary<string,string> como parte de mi modelo de vista. Lo que intento hacer es ciclar este objeto y sacarlo como un objeto json. El motivo es que puedo localizar correctamente los archivos de script de mi cliente.Salida de Json con el motor de vista Razor

La salida para esto tiene que ser algo como

var clientStrings = {"test":"yay","goodBye":"Nah"}; 

Alguna idea de cómo lograr esto correctamente.

Gracias de antemano.

Respuesta

10

Considerando que está en mvc 3, tendrá acceso a JavaScriptSerializer. Debería poder hacer lo siguiente:

JavaScriptSerializer serializer = new JavaScriptSerializer(); 
string json = serializer.Serialize((object)yourDictionary); 

Esto serializará su diccionario a json. Es posible que desee hacer esto en el controlador antes de enviar ViewData a la vista para procesar.

7

También puede integrar la biblioteca gratuita Json.NET dentro de su código.

Esta biblioteca no sufre los problemas JavascriptSerializer tiene como el problema de referencia circular.

Esta es una muestra usando la biblioteca a la salida JSON de una acción del controlador

public virtual ActionResult ListData() { 
    Dictionary<string, string> openWith = new Dictionary<string, string>(); 
    openWith.Add("txt", "notepad.exe"); 
    openWith.Add("bmp", "paint.exe"); 
    openWith.Add("dib", "paint.exe"); 
    openWith.Add("rtf", "wordpad.exe"); 

    JsonNetResult jsonNetResult = new JsonNetResult(); 
    jsonNetResult.Formatting = Formatting.Indented; 
    jsonNetResult.Data = openWith; 
    return jsonNetResult; 
} 

Si se ejecuta esta acción va a obtener los siguientes resultados

{ 
    "txt": "notepad.exe", 
    "bmp": "paint.exe", 
    "dib": "paint.exe", 
    "rtf": "wordpad.exe" 
} 

JsonNetResult es un simple contenedor de clase personalizada alrededor de las funcionalidades de la biblioteca Json.NET.

public class JsonNetResult : ActionResult 
{ 
    public Encoding ContentEncoding { get; set; } 
    public string ContentType { get; set; } 
    public object Data { get; set; } 

    public JsonSerializerSettings SerializerSettings { get; set; } 
    public Formatting Formatting { get; set; } 

    public JsonNetResult() { 
     SerializerSettings = new JsonSerializerSettings(); 
    } 

    public override void ExecuteResult(ControllerContext context) { 
     if (context == null) 
      throw new ArgumentNullException("context"); 

     HttpResponseBase response = context.HttpContext.Response; 

     response.ContentType = !string.IsNullOrEmpty(ContentType) 
      ? ContentType 
      : "application/json"; 

     if (ContentEncoding != null) 
      response.ContentEncoding = ContentEncoding; 

     if (Data != null) { 
      JsonTextWriter writer = new JsonTextWriter(response.Output) { Formatting = Formatting }; 

      JsonSerializer serializer = JsonSerializer.Create(SerializerSettings); 
      serializer.Serialize(writer, Data); 

      writer.Flush(); 
     } 
    } 
} 
+0

No estoy seguro de que JSON.NET pueda hacer Diccionarios, puede confirmar que sí, ya que eso es lo que RubbleFord está pidiendo –

+0

Funciona a la perfección :) He editado mi respuesta por placer – Lorenzo

+0

@Lorenzo, ¿por qué? usar esto sobre el construido en Json (xxx)? ¿Alguna ventaja? –

15

Está construido en MVC. Simplemente devuelve Json (yourobject).

Cuestiones relacionadas