ASP.NET Core 3.0 [FromBody] 문자열 내용이 "JSON 값을 시스템으로 변환할 수 없습니다.스트링.
사용.[FromBody]
에 내용을 문자열로 표시하다ApiController
ASP에 있습니다.NET Core 3.0은 다음 검증 오류를 반환합니다.
{"type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
"title":"One or more validation errors occurred.",
"status":400,
"traceId":"|9dd96d96-4e64bafba4ba0245.",
"errors":{"$":["The JSON value could not be converted to System.String. Path: $ | LineNumber: 0 | BytePositionInLine: 1."]}}
클라이언트가 content-type을 사용하여 데이터를 게시할 때:application/json
에서 raw json 데이터를 api 컨트롤러에서 문자열로 가져오려면 어떻게 해야 합니까?NET Core 3.0?클라이언트가 콘텐츠 유형을 갱신할 필요가 없습니다.
이게 도움이 될지는 모르겠지만, 그들이 .net core 3.0 Newtonsoft에서 약간의 변경을 가한 것 같아요.JSON 패키지를 사용해 보십시오.
설치하다Microsoft.AspNetCore.Mvc.NewtonsoftJson
패키지.
startup.cs에서 다음을 추가합니다.
services.AddControllers().AddNewtonsoftJson();
asp.net core 3.0 을 사용하고 있는 경우는, JSON 의 서포트가 짜넣어져 있습니다.저는 다음과 같은 것을 사용하고 있으며, 커스텀 입력 핸들러를 설정하지 않아도 동작합니다.
[HttpPost]
public async Task<IActionResult> Index([FromBody] JsonElement body)
{
string json = System.Text.Json.JsonSerializer.Serialize(body);
return Ok();
}
바꾸다[FromBody] string content
로.[FromBody] object content
그리고 문자열로 읽어야 할 경우에는content.ToString()
매개 변수를 변경한 경우[FromBody] String value
로.[FromBody] YourType value
자동으로 역직렬화 됩니다.
송신원:
// POST api/<SelectiveCallRulesController>
[HttpPost]
public async Task Post([FromBody] String rule)
{
...
수신인:
// POST api/<SelectiveCallRulesController>
[HttpPost]
public async Task Post([FromBody] SelectiveCallRule rule)
{
...
역직렬화에 관한 에러 메세지가 올바른 것을 깨닫기까지, 나는 계속 고민하고 있었다.
이 에러의 원인은, 「시스템」입니다.Text.Json은 문자열이 아닌 값을 문자열 속성으로 역직렬화하지 않습니다."(소스).
즉, 심플한 컨트롤러가 있는 경우[FromBody] string
인수:
[HttpPost("save")]
public async Task Save([FromBody] string content)
{
이 요청은 성공합니다.
curl -H "Content-Type: application/json" -X POST -d "\"abcdefgh\"" https://localhost:5000/save -v
하지만 이 작업은 실패합니다.
curl -H "Content-Type: application/json" -X POST -d "{\"content\":\"abcdefgh\"}" https://localhost:5000/save -v
실제로 유사한 오류가 발생하는 것은string
다른 간단한 타입의 경우는int
,bool
예를 들어, 인수 유형을 로 변경한 경우,int
위의 코드에서 JSON 전송{"content":123}
체내에서는 양보할 수 없다.JSON value could not be converted to System.Int32
에러입니다.
이 에러를 회피하려면 , 다음의 어느쪽인가를 실시합니다.
- 본론에서 의론을 통과시키기 위한 요구를 확정하다
"some string"
(JSON 대신) - 요청의 인수를 [FromQuery] 또는 [FromForm]으로 전달합니다.
- 또는 인수를 클래스의 속성으로 이동합니다(클래스 필드가 역직렬화되지 않으므로 이 멤버의 getter 및 setter를 잊지 마십시오).
public class Content
{
public string Value { get; set;}
}
...
[HttpPost("save")]
public async Task Save([FromBody] Content content)
{
ASP로 테스트.NET Core 7.0
json 필드가 포함된 다른 클래스를 만들 수 있습니다.
문자열 또는 개체 대신 JsonElement를 사용합니다.{yourcontrollname([FromBody] JsonElement your JSondata)}
제 경우 Angular 및 NET 6.0을 사용하고 있었습니다.
컨트롤러는 다음과 같습니다.
public string? Post([FromBody] string word)
{
}
각도로부터의 호출:
사용.
import { HttpClient, HttpHeaders } from '@angular/common/http';
코드:
const headers = new HttpHeaders({
'Content-Type': 'application/json'
});
청원을 json으로 표시합니다.
const body = JSON.stringify("myvalue");
this.http.post(this.baseUrl + 'controller', body, { headers: headers, responseType: 'text', withCredentials: true }).subscribe(result => {
this.mycontent = result;
}, error => console.error(error));
위의 예에서 Responstype은 컨트롤러가 스트링도 반환하고 있기 때문입니다.
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
[HttpPost]
public IActionResult SaveScreen([FromBody] JObject value)
{
JObject result = new JObject();
_log.LogInformation(JsonConvert.SerializeObject(value,Formatting.Indented));
return Content(JsonConvert.SerializeObject(result), "application/json; charset=UTF-8");
}
이게 네가 원하는 건지 모르겠지만 난 이 코드를 사용해서 내가 원하는 결과를 얻을 수 있어컨트롤러에 json 문자열을 게시하고 싶을 뿐입니다.
는 관습서를 .IInputFormatter
내 몸의 내용물이 항상 끈으로 해석될 수 있도록 하기 위해서요.
API 클라이언트를 모두 업데이트 할 수 없는 상황도 있었습니다.
은 어떤 것이든 해 줄 입니다.[FromBody]
파라미터는 발신자가 따옴표로 묶지 않아도 스트링으로 해석됩니다.
public class JsonStringInputFormatter : TextInputFormatter
{
public JsonStringInputFormatter() : base()
{
SupportedEncodings.Add(UTF8EncodingWithoutBOM);
SupportedEncodings.Add(UTF16EncodingLittleEndian);
SupportedMediaTypes.Add(MediaTypeNames.Application.Json);
}
public override bool CanRead(InputFormatterContext context)
{
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}
return context.ModelType == typeof(string);
}
public override async Task<InputFormatterResult> ReadRequestBodyAsync(
InputFormatterContext context, Encoding encoding)
{
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}
using (var streamReader = new StreamReader(
context.HttpContext.Request.Body,
encoding))
{
return await InputFormatterResult.SuccessAsync(
(await streamReader.ReadToEndAsync()).Trim('"'));
}
}
}
본문의 인용문을 트리밍하면 올바른 형식 및 인용문 랩핑된 본문 내용에 대해 전방 호환성을 유지할 수 있습니다.
「」, 「」의 전에, 되어 있는 .System.Text.Json
★★★★★★★★★★★★★★★★★★:
services.AddControllers()
.AddMvcOptions(options =>
{
options.InputFormatters.Insert(
0,
new JsonStringInputFormatter());
});
Json 개체를 문자열로 변환한 다음 서버로 보내야 합니다.JSON.stringify(jsonObj)처럼요.
언급URL : https://stackoverflow.com/questions/58150652/asp-net-core-3-0-frombody-string-content-returns-the-json-value-could-not-be
'source' 카테고리의 다른 글
시퀀스 값을 사용하여 여러 행을 Oracle에 삽입하려면 어떻게 해야 합니까? (0) | 2023.03.21 |
---|---|
Wordpress: 포스트 미디어 라이브러리의 모든 이미지를 쿼리합니다. (0) | 2023.03.21 |
JSON에서는 왜 각각의 이름이 인용됩니까? (0) | 2023.03.21 |
각도가 있는 인라인 스타일을 조작하는 것은 IE에서는 동작하지 않습니다. (0) | 2023.03.21 |
Gutenberg 편집기 화면 스크롤 블록 (0) | 2023.03.21 |