2011-09-29 12 views
43

Otrzymuję ciąg znaków, który zawiera poprawny JSON z innej usługi. Chciałbym tylko przekazać ten ciąg z Nancy, ale także ustawić typ zawartości na "application/json", który pozwoli mi usunąć potrzebę użycia $ .parseJSON (dane) po stronie klienta.Zwracanie łańcucha zawierającego poprawny Json z Nancy

Jeśli użyję Response.AsJson, wydaje się, że zmieniam JSON w łańcuchu i doda znaki escape. mogę utworzyć strumień z łańcucha i ustawić typ odpowiedzi coś takiego:

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

ale chciałby wiedzieć, czy istnieje prostszy sposób?

Odpowiedz

48

Podoba mi się, że uważasz, że powinien być lepszy sposób, ponieważ jesteś konieczności korzystania z 3 linii kodu, myślę, że mówi coś o Nancy :-)

nie mogę myśleć o „lepszy” sposób to zrobić, można zrobić to tak getBytes:

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

Lub "odrzuć ciąg" sposób:

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

     response.ContentType = "application/json"; 

     return response; 
    }; 

Oba robią to samo - ten drugi to mniej kodu, pierwszy bardziej opisowy (imo).

+0

Dzięki jego miło zobaczyć obie opcje. – Dave

5

Prawie tak, jak to robisz. Można zrobić:

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

Można po prostu utworzyć metodę rozszerzenia na IResponseFormatter i dostarczyć własnego pomocnika AsXXXX. Z wersją 0.8 będzie kilka rozszerzeń dotyczących samej odpowiedzi, dzięki czemu możesz robić rzeczy takie jak WithHeader (..), WithStatusCode() etc-

65

Wygląda Nancy ma piękny metodę rozszerzenia 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

Uwaga: aby to rozwiązanie działało, musisz poprawnie skonfigurować JsonSerializer, jeśli zamierzasz korzystać z serializatora JSON innego niż domyślny. Wolę odpowiedź od Stevena Robbinsa. – MaYaN

+0

Dodatek: Instrukcja korzystania z serializatora Newtonsoft z Nancy https://github.com/NancyFx/Nancy.Serialization.JsonNet – Roberto

10

Działa to również:

Response.AsText(myJsonString, "application/json"); 
Powiązane problemy