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

本文关键字:有效 包含 Json 字符串 一个 返回 Nancy 使用 | 更新日期: 2023-09-27 18:10:06

我收到一个字符串,其中包含来自另一个服务的有效JSON。我想与Nancy一起转发这个字符串,但也将内容类型设置为"application/json",这将允许我在客户端删除使用$. parsejson (data)的需要。

如果我使用Response。AsJson似乎在字符串中混淆了JSON并添加了转义字符。我可以用这个字符串创建一个流,并将响应类型设置为:

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

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

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

看起来Nancy得到了很好的回应。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);
            };

我喜欢你认为应该有一个更好的方法,因为你必须使用3行代码,我认为这说明了南希:-)

我想不出更好的方法来做这件事,你可以用GetBytes的方式来做:

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

或者"cast a string"的方式:

Get["/"] = _ =>
    {
        var response = (Response)myJsonString;
        response.ContentType = "application/json";
        return response;
    };

两者做同样的事情——后者代码更少,前者更具描述性(imo)。

这也可以:

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";
};