web-dev-qa-db-ja.com

Asp.net WEBAPIから明示的にJSON文字列を返しますか?

場合によっては、NewtonSoft JSON.NETがあり、コントローラーではJobjectをコントローラーから返すだけで、すべて正常です。

しかし、別のサービスから生のJSONを取得し、webAPIから返す必要がある場合があります。このコンテキストでは、NewtonSOftを使用できませんが、文字列からJOBJECTを作成して(不要な処理オーバーヘッドのように思えます)、それを返すと、すべてがうまくいきます。

ただし、これを単純に返したいのですが、文字列を返すと、クライアントはエンコードされた文字列としてコンテキストを含むJSONラッパーを受け取ります。

WebAPIコントローラーメソッドから明示的にJSONを返すにはどうすればよいですか?

83
klumsy

いくつかの選択肢があります。最も簡単な方法は、メソッドにHttpResponseMessageを返させ、文字列に基づいてStringContentでその応答を作成することです。これは以下のコードに似ています。

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

Nullまたは空の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);
}
190
carlosfigueira

以下は、WebApi2で導入されたIHttpActionResultインターフェイスを使用するように適応された@carlosfigueiraのソリューションです。

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);
}
6
Jpsy

WebAPI機能(XMLの許可など)を使用せずに、そのJSONのみを返す場合は、常に出力に直接書き込むことができます。これをASP.NETでホストしていると仮定すると、Responseオブジェクトにアクセスできるので、そのように文字列として書き出すことができ、実際にメソッドから何も返す必要はありません- '応答テキストは既に出力ストリームに書き込まれています。

2
Joe Enos

web API GETメソッドからJSONデータを返すサンプル例

[HttpGet]
public IActionResult Get()
{
            return Content("{\"firstName\": \"John\",  \"lastName\": \"Doe\", \"lastUpdateTimeStamp\": \"2018-07-30T18:25:43.511Z\",  \"nextUpdateTimeStamp\": \"2018-08-30T18:25:43.511Z\");
}
0
Muni Chittem