#json #asp.net-core #asp.net-web-api
#json #asp.net-core #asp.net-web-api
Вопрос:
Я пытаюсь написать действие с необработанным строковым параметром.
Эта строка будет динамически обрабатываться как json, поэтому ключи в json не известны во время компиляции.
Я объявил метод таким образом:
[HttpPost("MyAction")]
public async Task<ActionResult<long>> MyAction([FromBody] string command)
{
var cmd = MyCqrsCommand(command);
return await Mediator.Send(cmd);
}
Я вызываю метод с помощью swagger, который показывает параметр как application / json
Результат таков
{
"type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
"title": "One or more validation errors occurred.",
"status": 400,
"traceId": "|4e0e9c40-4036f8a9873ecac8.",
"errors": {
"$": [
"The JSON value could not be converted to System.String. Path: $ | LineNumber: 0 | BytePositionInLine: 1."
]
}
}
Я нашел два разных решения:
[HttpPost("MyAction")]
public async Task<ActionResult<long>> MyAction([FromBody] object command)
{ ... }
[HttpPost("MyAction")]
public async Task<ActionResult<long>> MyAction(string command)
{ ... }
Использование объекта не элегантно, но оно работает.
Использование «string» в uri имеет некоторые ограничения, поэтому я предпочитаю предыдущее.
Какое из них является лучшим решением? И есть ли способ вставить строку в тело, объявленное как string, а не как object?
Ответ №1:
Используйте JSONObject в качестве входного параметра вместо string и object .
Комментарии:
1. Хорошо, но для этого, похоже, требуется определенная структура json (от swagger): { «count»: 0, «item»: [ null ], «jsonType»: 0, «keys»: [ «string» ], «values»: [ [ null ] ] }; Я предпочитаюиметь свободный json для анализа. Возможно ли это?
Ответ №2:
Какое из них является лучшим решением?
Я предпочитаю использовать решение с параметром объекта.
[HttpPost("MyAction")]
public async Task<ActionResult<long>> MyAction([FromBody] object command)
{ ... }
На скриншоте вашего запроса мы видим, что вы отправили объект JSON { "key": "value" }
в свой MyAction
метод. Поэтому вы не должны объявлять свой параметр как string
.
И есть ли способ вставить строку в тело, объявленное как string, а не как object?
Если вы ожидаете использовать «string» в качестве входного параметра, просто отправьте содержимое value .
[HttpPost("/MyAction")]
public async Task<ActionResult<long>> MyAction([FromBody] string command)
Комментарии:
1. Вы отправили
"value"
неверный json, который обычно отправляется. Попробуйте отправить тело с допустимым json, и вы увидите, что ваше решение не работает