Возвращение строки, содержащей действительный 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));
но хотелось бы знать, есть ли более простой способ?
Ответы
Ответ 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() и т.д. -