2

サービス層の外部 API から JSON を直接キャプチャし、それを MVC 4 ApiController に返し、その ApiController を介して JSON を出力したいと考えています。他のいくつかのアクション (認証など) を同時に実行する必要があるため、基本的に別の API サービスのラッパーを作成しています。問題は、JSON が文字列に変換され、C# コードで文字列として渡されることです。これは、JSON にエスケープ文字を追加するだけです。とにかく、C# コードで JSON オブジェクトを渡すことができますか? 私の実装の詳細は以下のとおりです。

サービス層では、以下のメソッドで JSON を提供する API を使用しています。

return new WebClient().DownloadString(url);

残念ながら、これは文字列を返します。この API は既に JSON を返しているため、文字列に多くのエスケープ文字が追加されるため、これは問題です。

JSON は次のようになります。

[{"Citation":{"Attachments":[{"AttachedPersonIds":null,..."Type":"Record"}]

しかし、代わりに今はこのように見えます

"[{\"Citation\":{\"Attachments\":[{\"AttachedPersonIds\":null,...\"Type\":\"Record\"}]"

この文字列を取得したら、次のようにいくつかのメソッドを介して ApiController (JSON を返すように設定されています) に返します。

public class HintsController : ApiController
{
    public string Get(string treeId, string personId)
    {
        return _hintService.GetHints(treeId, personId);
    }
}

文字列をリテラル文字列に変換しようとし、文字列を再度シリアル化しようとしました。これを行うと、エスケープ文字が追加されるだけで、問題は解決しません。JSONから文字列にキャストしているため、最初の呼び出しをどのように消費しているかに問題があると思います。しかし、これを回避する方法がわかりません。

アイデアをお寄せいただきありがとうございます。

4

2 に答える 2

4

コントローラーは文字列を返すため、JSON フォーマッターは文字列全体を JSON 文字列にシリアル化し、埋め込まれた引用符をエスケープします。

次のようなことができます。

public HttpResponseMessage Get()
{
    var resp = new HttpResponseMessage()
    {
        Content = new StringContent("{json here...}")
    };
    resp.Content.Headers.ContentType = 
                  new MediaTypeHeaderValue("application/json");
    return resp;
}

これは、常に JSON を返す必要があることを前提としています。

于 2012-05-12T06:46:11.343 に答える
0

dynamic本当にオブジェクトを渡したい場合は、それをオブジェクトに変換して渡すことができます。

文字通りのエスケープ文字がどこから来ているのかわかりませんが、もう少し明確にできますか。APIはそれらを生成していますか、それともコードに他のポイントがありますか?文字列に実際には含まれておらず、印刷などが正常に機能したときに、以前にデバッグウィンドウでそれらを確認しました。

Json.net(標準)、組み込みのシリアライザー、https://github.com/jsonfx/jsonfxなどを使用できます。

jsonfxサイトから:

var reader = new JsonReader(); var writer = new JsonWriter();
string input = @"{ ""foo"": true, ""array"": [ 42, false, ""Hello!"", null ] }";

dynamic output = reader.Read(input);
Console.WriteLine(output.array[0]); // 42
string json = writer.Write(output);
Console.WriteLine(json); // {"foo":true,"array":[42,false,"Hello!",null]}

他にもいくつかの方法があります。次のスレッドを参照してください。

于 2012-05-14T07:06:36.487 に答える