別のサービスから有効な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));
しかし、もっと簡単な方法があるかどうか知りたいですか?
あなたは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)。
ナンシーは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);
};
これも機能します:
Response.AsText(myJsonString, "application/json");
ほぼその方法。できる
var response = (Response)myJsonString;
response.ContentType = "application/json";
IResponseFormatterで拡張メソッドを作成し、独自のAsXXXXヘルパーを提供できます。 0.8リリースでは、応答自体にいくつかの拡張機能が追加されるため、WithHeader(..)、WithStatusCode()などのようなことができます。
モジュールのすべてのルートがJSON文字列を返す場合、すべてのルートのAfter
フックにコンテンツタイプを一度に設定できます。
Get["/"] = _ =>
{
// ...
return myJsonString;
};
After += ctx =>
{
ctx.Response.ContentType = "application/json";
};