50

我从另一个服务收到一个包含有效 JSON 的字符串。我只想将这个字符串转发给 Nancy,但还将内容类型设置为“application/json”,这将允许我无需在客户端使用 $.parseJSON(data)。

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

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

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

4

5 回答 5

75

看起来南希有一个很好的 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 回答
1

如果您的模块的所有路由都返回一个 JSON 字符串,那么您可以After一次在钩子中为所有路由设置内容类型:

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

After += ctx =>
{
    ctx.Response.ContentType = "application/json";
};
于 2019-03-25T22:21:13.330 回答