場合によっては、NewtonSoft JSON.NETがあり、コントローラーではJobjectをコントローラーから返すだけで、すべて正常です。
しかし、別のサービスから生のJSONを取得し、webAPIから返す必要がある場合があります。このコンテキストでは、NewtonSOftを使用できませんが、文字列からJOBJECTを作成して(不要な処理オーバーヘッドのように思えます)、それを返すと、すべてがうまくいきます。
ただし、これを単純に返したいのですが、文字列を返すと、クライアントはエンコードされた文字列としてコンテキストを含むJSONラッパーを受け取ります。
WebAPIコントローラーメソッドから明示的にJSONを返すにはどうすればよいですか?
いくつかの選択肢があります。最も簡単な方法は、メソッドに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);
}
以下は、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);
}
WebAPI機能(XMLの許可など)を使用せずに、そのJSONのみを返す場合は、常に出力に直接書き込むことができます。これをASP.NETでホストしていると仮定すると、Response
オブジェクトにアクセスできるので、そのように文字列として書き出すことができ、実際にメソッドから何も返す必要はありません- '応答テキストは既に出力ストリームに書き込まれています。
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\");
}