Возвращение строки, содержащей действительный Json с Nancy - PullRequest
47 голосов
/ 29 сентября 2011

Я получаю строку, содержащую действительный JSON от другого сервиса.Я хотел бы просто переслать эту строку с Нэнси, но также установить тип содержимого "application / json", что позволит мне устранить необходимость использования $ .parseJSON (data) на стороне клиента.

Если я использую Response.AsJson, он, похоже, искажает JSON в строке и добавляет escape-символы.Я мог бы создать поток со строкой и установить тип ответа что-то вроде:

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

, но хотел бы знать, есть ли более простой способ?

Ответы [ 5 ]

73 голосов
/ 04 ноября 2012

Похоже, у Нэнси есть хороший метод расширения 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);
            };
54 голосов
/ 30 сентября 2011

Мне нравится, что вы думаете, что должен быть лучший способ, потому что вам нужно использовать 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).

18 голосов
/ 28 июля 2016

Это также работает:

Response.AsText(myJsonString, "application/json");
7 голосов
/ 30 сентября 2011

Практически так, как вы это делаете.Вы можете сделать

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

Вы можете просто создать метод расширения в IResponseFormatter и предоставить свой собственный помощник AsXXXX.С выпуском 0.8 в ответ будет добавлено несколько расширений, поэтому вы можете делать такие вещи, как WithHeader (..), WithStatusCode () и т. Д. -

1 голос
/ 26 марта 2019

Если все маршруты вашего модуля возвращают строку JSON, вы можете установить тип контента в хуке After для всех маршрутов сразу:

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

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