web-dev-qa-db-ja.com

Nancyで有効なJsonを含む文字列を返す

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

Response.AsJsonを使用すると、文字列内のJSONが破損し、エスケープ文字が追加されるようです。文字列でストリームを作成し、応答タイプを次のように設定できます。

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

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

47
Dave

あなたは3行のコードを使用しなければならないので、あなたはより良い方法があるべきだと思うのが好きです、私はそれがナンシーについて何かを言うと思います:-)

私はそれを行うための「より良い」方法を考えることはできません。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)。

54
Steven Robbins

ナンシーはNice 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);
            };
73
Darius

これも機能します:

Response.AsText(myJsonString, "application/json");
18
djoyce

ほぼその方法。できる

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

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

7
TheCodeJunkie

モジュールのすべてのルートがJSON文字列を返す場合、すべてのルートのAfterフックにコンテンツタイプを一度に設定できます。

Get["/"] = _ =>
{
    // ... 
    return myJsonString;
};

After += ctx =>
{
    ctx.Response.ContentType = "application/json";
};
1
Peter Kofler