50

別のサービスから有効な JSON を含む文字列を受け取りました。この文字列を Nancy に転送するだけでなく、クライアント側で $.parseJSON(data) を使用する必要をなくすために content-type を "application/json" に設定したいと思います。

Response.AsJson を使用すると、文字列内の JSON が壊れて、エスケープ文字が追加されたように見えます。文字列を使用して Stream を作成し、次のような応答タイプを設定できます。

Response test = new Response();
test.ContentType = "application/json";
test.Contents = new MemoryStream(Encoding.UTF8.GetBytes(myJsonString)); 

もっと簡単な方法があるかどうか知りたいですか?

4

5 に答える 5

75

Nancy は素敵な Response.AsJson 拡張メソッドを持っているようです:

Get["/providers"] = _ =>
            {
                var providers = this.interactiveDiagnostics
                                    .AvailableDiagnostics
                                    .Select(p => new { p.Name, p.Description, Type = p.GetType().Name, p.GetType().Namespace, Assembly = p.GetType().Assembly.GetName().Name })
                                    .ToArray();

                return Response.AsJson(providers);
            };
于 2012-11-04T15:56:27.893 に答える
59

3行のコードを使用する必要があるため、より良い方法があるはずだとあなたが考えるのが好きです.Nancyについて何かを言っていると思います:-)

それを行うための「より良い」方法は考えられません。GetBytes の方法で行うこともできます。

Get["/"] = _ =>
    {
        var jsonBytes = Encoding.UTF8.GetBytes(myJsonString);
        return new Response
            {
                ContentType = "application/json",
                Contents = s => s.Write(jsonBytes, 0, jsonBytes.Length)
            };
    };

または「文字列をキャストする」方法:

Get["/"] = _ =>
    {
        var response = (Response)myJsonString;

        response.ContentType = "application/json";

        return response;
    };

どちらも同じことを行います - 後者はコードが少なく、前者はより説明的です (imo)。

于 2011-09-30T12:05:38.557 に答える
19

これも機能します:

Response.AsText(myJsonString, "application/json");
于 2016-07-28T15:45:58.693 に答える
7

ほとんどあなたのやり方です。あなたができる

var response = (Response)myJsonString;
response.ContentType = "application/json";

IResponseFormatter で拡張メソッドを作成し、独自の AsXXXX ヘルパーを提供するだけです。0.8 リリースでは、応答自体にいくつかの拡張機能があるため、WithHeader(..)、WithStatusCode() などを実行できます。

于 2011-09-30T11:56:26.327 に答える