“尝试调用控制器端点时无法将JSON值转换为System.String”
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了“尝试调用控制器端点时无法将JSON值转换为System.String”相关的知识,希望对你有一定的参考价值。
我一直在尝试创建一个简单的API,我设法使Get
正常工作,但是每当我尝试使用Post
或Put
时,我都无法使其正常工作。我正在尝试发布/放置JSON并将其作为字符串在我的控制器中获取。我正在使用Postman和Insomnia进行测试(由于我是在本地运行的,因此我转为同时使用SSL验证)。这是我的控制器:
[Route("backoffice/[controller]")]
[ApiController]
public class AddQuestionController : ControllerBase
{
private IQuestionRepository _questionRepository;
public AddQuestionController(IQuestionRepository questionRepository)
{
_questionRepository = questionRepository ?? throw new ArgumentNullException(nameof(questionRepository));
}
[ProducesResponseType((int)System.Net.HttpStatusCode.OK)]
[HttpPost]
public async Task<ActionResult> AddQuestion([FromBody] string question)
{
Question q = JsonConvert.DeserializeObject<Question>(question);
await Task.Run(() => _questionRepository.InsertOne(q));
return Ok();
}
}
{
"type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
"title": "One or more validation errors occurred.",
"status": 400,
"traceId": "|a0b79872-4e41e975d19e251e.",
"errors": {
"$": [
"The JSON value could not be converted to System.String. Path: $ | LineNumber: 0 | BytePositionInLine: 1."
]
}
}
所以我当时想这是因为邮递员中的Json
格式。但是后来我尝试了text
格式这发生了:
{
"type": "https://tools.ietf.org/html/rfc7231#section-6.5.13",
"title": "Unsupported Media Type",
"status": 415,
"traceId": "|a0b79873-4e41e975d19e251e."
}
而且每次它甚至都没有到达控制器的第一行时。有人可以告诉我我在这里做错了什么吗?是我的控制器吗?这是我使用邮递员的方式吗?
答案
模型绑定器无法将发送的数据映射/绑定到控制器参数
您的操作需要来自请求正文的简单字符串
public async Task<ActionResult> AddQuestion([FromBody] string question)
但是您发送了一个复杂的对象
{ "test" : "test" }
如果属性名称匹配,则可能已匹配
例如
{ "question" : "test" }
因为模型绑定器在匹配参数时会考虑属性名称。
如果要接收原始字符串,则需要发送有效的原始JSON字符串
"{ "test": "test "}"
已正确转义。
另一个选项是对参数使用复杂的对象
class Question {
public string test { get; set; }
//...other properties
}
与预期数据匹配
public async Task<ActionResult> AddQuestion([FromBody] Question question) {
string value = question.test;
//...
}
参考Model Binding in ASP.NET Core
以上是关于“尝试调用控制器端点时无法将JSON值转换为System.String”的主要内容,如果未能解决你的问题,请参考以下文章