Подтвердить что ты не робот

Возвращение строки, содержащей действительный Json с Nancy

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

Похоже, у Нэнси появился отличный метод расширения 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);
            };

Ответ 3

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

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

Ответ 4

В значительной степени, как вы это делаете. Вы могли бы сделать

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

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