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


88

場合によっては、NewtonSoft JSON.NETを使用していて、コントローラーでコントローラーからJobjectを返すだけで、すべて問題ありません。

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

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

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

回答:


201

いくつかの選択肢があります。最も簡単な方法は、メソッドにを返し、文字列に基づいて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);
}

4
優秀な。私は、JSON文字列を作成し、文字列が、結果の周りにその導入は避けられない余分な"としてそれを返していました。これは、これを修正する必要があります。。
dumbledad

1
これは迷惑です。実際にを作成しHttpResponseMessage responseStringContentから、を.Contentプロパティに割り当てる必要があります。コンストラクターでStringContentを割り当てた場合は機能しません。
スアメア2018

16

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

2

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


1

Web APIGETメソッドから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\");
}

2
コンテンツはどこから来たのですか?完全修飾名または「using」ステートメントが役立ちます。
granadaCoder

0

これらも機能します:

[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);
}

0

これは、.NET Core3.1で機能します。

private async Task<ContentResult> ChannelCosmicRaysAsync(HttpRequestMessage request)
{
    // client is HttpClient
    using var response = await client.SendAsync(request).ConfigureAwait(false); 

    var responseContentString = await response.Content.ReadAsStringAsync().ConfigureAwait(false);

    Response.StatusCode = (int)response.StatusCode;
    return Content(responseContentString, "application/json");
}
public Task<ContentResult> X()
{
    var request = new HttpRequestMessage(HttpMethod.Post, url);
    (...)

    return ChannelCosmicRaysAsync(request);
}

ContentResultですMicrosoft.AspNetCore.Mvc.ContentResult

これはヘッダーをチャネルしないことに注意してください、しかし私の場合、これは私が必要とするものです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.