Eine JSON-Zeichenfolge explizit von Asp.net WEBAPI zurückgeben?

85

In einigen Fällen habe ich NewtonSoft JSON.NET und in meinem Controller gebe ich einfach das Jobobjekt von meinem Controller zurück und alles ist gut.

Aber ich habe einen Fall, in dem ich etwas unformatiertes JSON von einem anderen Dienst bekomme und es von meiner WebAPI zurückgeben muss. In diesem Zusammenhang kann ich NewtonSOft nicht verwenden, aber wenn ich könnte, würde ich ein JOBJECT aus der Zeichenfolge erstellen (was wie unnötiger Verarbeitungsaufwand erscheint) und das zurückgeben, und alles wäre gut mit der Welt.

Ich möchte dies jedoch einfach zurückgeben, aber wenn ich die Zeichenfolge zurückgebe, erhält der Client einen JSON-Wrapper mit meinem Kontext als codierte Zeichenfolge.

Wie kann ich einen JSON explizit von meiner WebAPI-Controller-Methode zurückgeben?

klumsy
quelle

Antworten:

197

Es gibt einige Alternativen. Am einfachsten ist es, wenn Ihre Methode a zurückgibt HttpResponseMessageund diese Antwort mit a StringContentbasierend auf Ihrer Zeichenfolge erstellt, ähnlich dem folgenden Code:

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

Und überprüfen Sie null oder leere JSON-Zeichenfolge

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);
}
carlosfigueira
quelle
4
Ausgezeichnet. Ich habe eine JSON-Zeichenfolge erstellt und als Zeichenfolge zurückgegeben, aber dies führte zu einem unvermeidlichen zusätzlichen "Ergebnis". Dies sollte das beheben.
Dumbledad
1
Das ist nervig. Sie müssen das tatsächlich erstellen HttpResponseMessage responseund dann StringContentder .ContentEigenschaft zuweisen . Es funktioniert nicht, wenn Sie den StringContent im Konstruktor zuweisen.
Suamere
13

Hier ist die Lösung von @ carlosfigueira, die für die Verwendung der mit WebApi2 eingeführten IHttpActionResult-Schnittstelle angepasst wurde:

public IHttpActionResult Get()
{
    string yourJson = GetJsonFromSomewhere();
    if (string.IsNullOrEmpty(yourJson)){
        return NotFound();
    }
    var response = this.Request.CreateResponse(HttpStatusCode.OK);
    response.Content = new StringContent(yourJson, Encoding.UTF8, "application/json");
    return ResponseMessage(response);
}
Jpsy
quelle
2

Wenn Sie speziell nur diesen JSON zurückgeben möchten, ohne WebAPI-Funktionen zu verwenden (z. B. XML zulassen), können Sie jederzeit direkt in die Ausgabe schreiben. Angenommen, Sie hosten dies mit ASP.NET, haben Sie Zugriff auf das ResponseObjekt, sodass Sie es auf diese Weise als Zeichenfolge ausschreiben können. Dann müssen Sie nichts von Ihrer Methode zurückgeben - Sie haben das bereits geschrieben Antworttext zum Ausgabestream.

Joe Enos
quelle
0

Beispielbeispiel zum Zurückgeben von JSON-Daten von der Web-API-GET-Methode

[HttpGet]
public IActionResult Get()
{
            return Content("{\"firstName\": \"John\",  \"lastName\": \"Doe\", \"lastUpdateTimeStamp\": \"2018-07-30T18:25:43.511Z\",  \"nextUpdateTimeStamp\": \"2018-08-30T18:25:43.511Z\");
}
Muni Chittem
quelle
1
Woher kommt der Inhalt? Ein vollständig qualifizierter Name oder eine "using" -Anweisung wäre hilfreich.
GranadaCoder
0

diese funktionieren auch:

[HttpGet]
[Route("RequestXXX")]
public ActionResult RequestXXX()
{
    string error = "";
    try{
        _session.RequestXXX();
    }
    catch(Exception e)
    {
        error = e.Message;
    }
    return new JsonResult(new { error=error, explanation="An error happened"});
}

[HttpGet]
[Route("RequestXXX")]
public ActionResult RequestXXX()
{
    string error = "";
    try{
        _session.RequestXXX();
    }
    catch(Exception e)
    {
        error = e.Message;
    }
    return new JsonResult(error);
}
eci
quelle