使用Nancy返回包含有效Json的字符串

时间:2011-09-29 12:03:20

标签: c# json nancy

我收到一个包含来自其他服务的有效JSON的字符串。 我想用Nancy转发这个字符串,但也将content-type设置为“application / json”,这样我就可以省去在客户端使用$ .parseJSON(data)的需要。

如果我使用Response.AsJson,它似乎会破坏字符串中的JSON并添加转义字符。 我可以使用字符串创建一个Stream,并将响应类型设置为:

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

但想知道是否有更简单的方法?

5 个答案:

答案 0 :(得分:72)

看起来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);
            };

答案 1 :(得分:53)

我喜欢你认为应该有一个更好的方法,因为你必须使用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)。

答案 2 :(得分:16)

这也有效:

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

答案 3 :(得分:6)

就像你做的那样。你可以做到

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

您可以在IResponseFormatter上创建一个扩展方法,并提供您自己的AsXXXX帮助程序。有了0.8版本,它会有一些自我响应的扩展,所以你可以做像WithHeader(..),WithStatusCode()等的东西 -

答案 4 :(得分:0)

如果模块的所有路由均返回JSON字符串,则可以一次在After挂钩中为所有路由设置内容类型:

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

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