2013-06-13 13 views
66

W niektórych przypadkach mam NewtonSoft JSON.NET iw moim kontrolerze po prostu zwracam Jobject z kontrolera i wszystko jest w porządku.Zwrócić ciąg JSON jawnie z Asp.net WEBAPI?

Ale mam przypadek, w którym otrzymuję jakiś surowy JSON z innej usługi i muszę go zwrócić z mojego interfejsu sieciowego. W tym kontekście nie mogę używać NewtonSOft, ale gdybym mógł, to utworzyłbym JOBJECT z łańcucha (który wydaje się niepotrzebnym przetwarzaniem narzutowym) i zwrócił to i wszystko byłoby dobrze ze światem.

Jednak chcę to zwrócić w prosty sposób, ale jeśli zwrócę ciąg znaków, klient otrzyma opakowanie JSON z moim kontekstem jako zakodowany ciąg znaków.

Jak mogę jawnie zwrócić JSON z mojej metody kontrolera WebAPI?

Odpowiedz

162

Istnieje kilka alternatyw. Najprostszym z nich jest mieć swój sposób zwrócić HttpResponseMessage i tworzyć tę odpowiedź z StringContent opartego na ciąg, coś podobnego do poniższego kodu:

public HttpResponseMessage Get() 
{ 
    string yourJson = GetJsonFromSomewhere(); 
    var response = this.Request.CreateResponse(HttpStatusCode.OK); 
    response.Content = new StringContent(yourJson, Encoding.UTF8, "application/json"); 
    return response; 
} 

i sprawdzanie null lub pusty ciąg JSON

public HttpResponseMessage Get() 
{ 
    string yourJson = GetJsonFromSomewhere(); 
    if (!string.IsNullOrEmpty(yourJson)) 
    { 
     var response = this.Request.CreateResponse(HttpStatusCode.OK); 
     response.Content = new StringContent(yourJson, Encoding.UTF8, "application/json"); 
     return response; 
    } 
    throw new HttpResponseException(HttpStatusCode.NotFound); 
} 
+0

Cudownie !! Dzięki carlos! :) – ManJan

+4

Doskonały. Tworzyłem ciąg JSON i zwracałem go jako ciąg, ale to wprowadziło nieuniknione dodatkowe "wokół wyniku.To powinno to naprawić." – dumbledad

+0

To jest denerwujące.Musisz faktycznie utworzyć 'odpowiedź HttpResponseMessage', a następnie przypisać' StringContent' do właściwość '.Content'. Nie działa, jeśli przypiszesz StringContent do Konstruktora. – Suamere

2

Jeśli chcesz zwrócić tylko ten JSON, bez korzystania z funkcji WebAPI (takich jak zezwalanie na XML), zawsze możesz pisać bezpośrednio na dane wyjściowe. Zakładając, że hostujesz to w ASP.NET, masz dostęp do obiektu Response, więc możesz zapisać go w ten sposób jako ciąg znaków, wtedy nie musisz zwracać niczego ze swojej metody - już napisałeś tekst odpowiedzi do strumienia wyjściowego.

Powiązane problemy