2011-09-29 3 views
43

Ricevo una stringa che contiene JSON valido da un altro servizio. Vorrei solo inoltrare questa stringa con Nancy, ma anche impostare il tipo di contenuto su "application/json" che mi consentirà di rimuovere la necessità di utilizzare $ .parseJSON (dati) sul lato client.Restituzione di una stringa contenente JSON valido con Nancy

Se utilizzo Response.AsJson sembra maneggiare il JSON nella stringa e aggiunge caratteri di escape. ho potuto creare un flusso con la stringa e impostare il tipo di risposta qualcosa come:

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

ma vorrei sapere se c'è un modo più semplice?

risposta

48

Mi piace che tu pensi che ci dovrebbe essere un modo migliore perché sei dover utilizzare 3 righe di codice, penso che dice qualcosa su Nancy :-)

non riesco a pensare ad un modo "migliore" per farlo, è possibile farlo nel modo GetBytes:

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

O il "cast una stringa" modo:

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

     response.ContentType = "application/json"; 

     return response; 
    }; 

Entrambi fanno la stessa cosa: il secondo è meno codice, il primo più descrittivo (imo).

+0

Grazie il suo bello vedere entrambe le opzioni. – Dave

5

Praticamente come lo si fa. Si potrebbe fare

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

si può solo creare un metodo di estensione su IResponseFormatter e fornire il proprio aiuto AsXXXX. Con la versione 0.8 ci saranno alcune estensioni sulla risposta in modo che tu possa fare cose come WithHeader (..), WithStatusCode() ecc-

65

Sembra che Nancy ha un bel metodo di estensione 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 per far funzionare questa soluzione è necessario che JsonSerializer sia configurato correttamente se si intende utilizzare un serializzatore JSON diverso da quello predefinito. Preferisco di gran lunga la risposta di Steven Robbins. – MaYaN

+0

Addendum: istruzioni per l'uso del serializzatore Newtonsoft con Nancy https://github.com/NancyFx/Nancy.Serialization.JsonNet – Roberto

10

Questo funziona anche:

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