2011-09-29 22 views
43

Recibo una cadena que contiene JSON válida de otro servicio. Me gustaría simplemente reenviar esta cadena con Nancy, pero también establecer el tipo de contenido en "application/json" que me permitirá eliminar la necesidad de usar $ .parseJSON (datos) en el lado del cliente.Devolución de una cadena que contiene Json válida con Nancy

Si uso Response.AsJson parece destruir el JSON en la cadena y agrega caracteres de escape. que podría crear una secuencia con la cadena y establecer el tipo de respuesta algo como:

Response test = new Response(); 
test.ContentType = "application/json"; 
test.Contents = new MemoryStream(Encoding.UTF8.GetBytes(myJsonString)); 

pero me gustaría saber si hay una manera más sencilla?

Respuesta

48

Me gusta que piense que debería haber una mejor manera porque usted está tener que utilizar 3 líneas de código, creo que dice algo sobre Nancy :-)

no puedo pensar en una manera "mejor" para hacerlo, puede hacerlo de la manera GetBytes:

Get["/"] = _ => 
    { 
     var jsonBytes = Encoding.UTF8.GetBytes(myJsonString); 
     return new Response 
      { 
       ContentType = "application/json", 
       Contents = s => s.Write(jsonBytes, 0, jsonBytes.Length) 
      }; 
    }; 

O la forma en "convertir una cadena":

Get["/"] = _ => 
    { 
     var response = (Response)myJsonString; 

     response.ContentType = "application/json"; 

     return response; 
    }; 

Ambos hacen lo mismo: el último es menos código, el primero es más descriptivo (imo).

+0

Gracias a su agradable ver ambas opciones. – Dave

5

Casi como lo haces. Usted podría hacer

var response = (Response)myJsonString; 
response.ContentType = "application/json"; 

sólo podría crear un método de extensión en IResponseFormatter y proporcionar su propia ayudante AsXXXX. Con la versión 0.8 habrá algunas extensiones en la respuesta para que pueda hacer cosas como WithHeader (..), WithStatusCode() etc-

65

Parece que Nancy tiene un buen método de extensión Response.AsJson:

Get["/providers"] = _ => 
      { 
       var providers = this.interactiveDiagnostics 
            .AvailableDiagnostics 
            .Select(p => new { p.Name, p.Description, Type = p.GetType().Name, p.GetType().Namespace, Assembly = p.GetType().Assembly.GetName().Name }) 
            .ToArray(); 

       return Response.AsJson(providers); 
      }; 
+0

Nota para que esta solución funcione, necesita tener el JsonSerializer configurado correctamente si tiene la intención de utilizar un serializador JSON que no sea el predeterminado. Yo prefiero la respuesta de Steven Robbins. – MaYaN

+0

Adición: Instrucciones para usar el serializador de Newtonsoft con Nancy https://github.com/NancyFx/Nancy.Serialization.JsonNet – Roberto

10

Esto también funciona:

Response.AsText(myJsonString, "application/json"); 
Cuestiones relacionadas