2016-03-26 36 views
0

私は元々HttpResponseMessageを返すメソッドを持っていましたが、これをIHttpActionResultに返すように変換したいと思います。JSON文字列を使用したIHttpActionResult

私の問題は、JSON.Netを使用してJSON.Netを使用して複雑な汎用ツリー構造をシリアライズすることです。これはよく書かれたJsonConverterというカスタムを使用しています(コードは正常に動作しています)。

は、ここでそれが返すものです:カスタムコンバータの出番

string json = NodeToJson(personNode); 

    HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK); 
    response.Content = new StringContent(json, Encoding.UTF8, "application/json"); 

    return response; 

NodeToJson方法がある...

private static string NodeToJson(Node<Person> personNode) { 

    var settings = new JsonSerializerSettings { 
     Converters = new List<JsonConverter> { new OrgChartConverter() }, 
     Formatting = Formatting.Indented 
    }; 

    return JsonConvert.SerializeObject(personNode, settings); 

} 

注これはJSONとしてフォーマットstringを返します。

これをIHttpActionResultに切り替えると、何を試しても失敗するようです。私はちょうどそれを残すことができます(それが動作)が、私はこれとIHttpActionResultは私が使用してすべきかであるように思わためのベストプラクティスを使用してすることになっています。

私はreturn Json(json);にしようとしましたが、おそらくダブル変換を実行しようとしているため、これは無効な解析不可能なJSONになりますか?

return Ok(json);の結果、JSON文字列がXMLでラップされます。

これを行う正しい方法は何ですか?

EDIT:

私はこの特定の方法を除いて、今IHttpActionResultを使用するには、このプロジェクト内のすべての方法を成功裏に変換しています。

JSONへの汎用ツリーのシリアライズです。どのようなアプローチを試みても、無効なJSONが返されます。 HttpResponseMsessageアプローチはうまく動作しますが、私はIHttpActionResultに戻って有効なJSONを取得することはできません。

答えて

0

おやすみなさい。私は同じ問題を持っているし、コードのこの部分は、(JSONをデシリアライズするNewtonsoft.Json nugetパッケージを使用して)私の仕事:

var unserializedContent = JsonConvert.DeserializeObject(json); 
return Json(unserializedContent); 

我々がJSON(するためにオブジェクトを持っている必要がありそうです)として働きますそうすべき。

+1

送信する前にjson文字列を直列化解除してシリアル化し直しています。これは、アプリケーションのパフォーマンスとスケーラビリティに影響します。 \ –

0

正しい方法で返すことです: Ok(json);

それがデフォルト受け入れ戻り値の型だからそれはXMLに結果を変換しています。追加してみてください:あなたのAPIリクエストヘッダに Accept: application/jsonを、私はそれが問題を解決すべきだと思います。

+0

これは、「受け入れ」という言葉には何が関係していますか?これは 'RegisterGlobalFilters'に入りますか?戻り値の型を変更するだけで、これを5倍複雑にしたくありません。私はそれがより簡単になることを望んでいました、私はすでに文字列に適切なJSONを持って、送信する準備ができました。 – Patrick

1

あなたは戻り値の型としてXMLを使用するつもりはありません場合は、あなたもあなたのWebApiConfigでXmlFormatterを削除することができます。

config.Formatters.Remove(config.Formatters.XmlFormatter); 
+0

これを追加したが役に立たなかった。私はまだ解析できないJSONを取り返しています。 JSONを「きれい」にするChrome拡張機能があり、このフォーマッタではこれ以上の結果が得られません。私の元のコードで動作します。これは、 'return Ok(json);を使ったものです。私はそれがXMLラッピングを削除したことに注意します。私はこれをFiddlerを通して実行し、ヘッダーが何であるかを見ています。 – Patrick

+1

返すjsonを手作業で構築しなければならなかったときはいつも、あなたの他のSO投稿ごとにHttpResponseMessage戻り値の型を使用しました。 Ok()は、クラスオブジェクトを渡してwebapiでシリアライゼーションを行うときにのみ正しくシリアライズするようです。 –

+0

はい、まさに私が見ているものです。 'パブリッククラスノード:されたIEqualityComparer、IEnumerableを>' IEnumerableを私は私のカスタムコンバータバック 'HttpResponseMessage'に行ってきたこれはかなり複雑で、いくつかのNodeオブジェクトからなる一般的なツリーオブジェクトです。私はこれを言うために私の質問を編集した。 もっと簡単なJSONを返す私の他のメソッドは、簡単に 'IHttpActionResult'に変換されました。 – Patrick

7

独自のIHttpActionResultクラスインスタンスを作成して、JSONとコントローラまたはベースコントローラクラスのメソッドを使用してそれを利用することができます。

は、コンテンツやステータスコードを設定しIHttpActionResultインスタンスを作成します。

public class JsonTextActionResult : IHttpActionResult 
{ 
    public HttpRequestMessage Request { get; } 

    public string JsonText { get; } 

    public JsonTextActionResult(HttpRequestMessage request, string jsonText) 
    { 
     Request = request; 
     JsonText = jsonText; 
    } 

    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken) 
    { 
     return Task.FromResult(Execute()); 
    } 

    public HttpResponseMessage Execute() 
    { 
     var response = this.Request.CreateResponse(HttpStatusCode.OK); 
     response.Content = new StringContent(JsonText, Encoding.UTF8, "application/json"); 

     return response; 
    } 
} 

は、結果を作成するために、あなたのコントローラにメソッドを追加します。ここにWeb APIの例があります:

public class MyApiController : ApiController 
{ 
    protected internal virtual JsonTextActionResult JsonText(string jsonText) 
    { 
     return new JsonTextActionResult(Request, jsonText); 
    } 

    [HttpGet] 
    public IHttpActionResult GetJson() 
    { 
     string json = GetSomeJsonText(); 
     return JsonText(json); 
    } 
} 
0

WebサービスでXMLタグでJSON文字列を返すのと同じ問題がありました。私はすべてのシンプルなソリューションを試しました。

return Json(text)、json jsonのデシリアライズと追加を行いましたが、それは役に立たなかったです。 jsonオブジェクトの周りに二重引用符があるか、または形式が正しくありませんでした。

TGRAが作成したソリューションのみが私のために働いていました。

別の勧告は以下の通りであるJSON

1

を返すために、独自のIHttpActionResultクラスのインスタンスを作成します。

var json = JToken.FromObject(yourObject); 
return Ok(json); 
関連する問題