[c#] ASP.NET Core 3.0 System.Text.Json Camel Case 직렬화

ASP.NET Core 3.0 웹 API 프로젝트에서 Pascal Case 속성을 Camel Case로 직렬화 / 직렬화하기 위해 System.Text.Json 직렬화 옵션을 어떻게 지정 합니까?

Pascal Case 속성이 다음과 같은 모델이있는 경우 :

public class Person
{
    public string Firstname { get; set; }
    public string Lastname { get; set; }
}

그리고 System.Text.Json을 사용하여 JSON 문자열을 Person클래스 유형으로 직렬화 해제하는 코드 :

var json = "{\"firstname\":\"John\",\"lastname\":\"Smith\"}";
var person = JsonSerializer.Deserialize<Person>(json);

JsonPropertyName을 다음과 같은 각 속성에 사용 하지 않으면 역 직렬화되지 않습니다 .

public class Person
{
    [JsonPropertyName("firstname")
    public string Firstname { get; set; }
    [JsonPropertyName("lastname")
    public string Lastname { get; set; }
}

에서 다음을 시도했지만 startup.cs여전히 필요한 측면에서는 도움이되지 않았습니다 JsonPropertyName.

services.AddMvc().AddJsonOptions(options =>
{
    options.JsonSerializerOptions.DictionaryKeyPolicy = JsonNamingPolicy.CamelCase;
    options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
});

// also the following given it's a Web API project

services.AddControllers().AddJsonOptions(options => {
    options.JsonSerializerOptions.DictionaryKeyPolicy = JsonNamingPolicy.CamelCase;
    options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
        });

새로운 System.Text.Json 네임 스페이스를 사용하여 ASP.NET Core 3.0에서 Camel Case serialize / deserialize를 어떻게 설정할 수 있습니까?

감사!



답변

AddJsonOptions()System.Text.JsonMVC에 대해서만 구성 합니다. JsonSerializer자신의 코드에서 사용 하려면 구성을 전달해야합니다.

var options = new JsonSerializerOptions
{
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
};

var json = "{\"firstname\":\"John\",\"lastname\":\"Smith\"}";
var person = JsonSerializer.Parse<Person>(json, options);


답변

에서 startup.cs:

// keeps the casing to that of the model when serializing to json (default is converting to camelCase)
services.AddMvc()
    .AddJsonOptions(options => options.JsonSerializerOptions.PropertyNamingPolicy = null); 

따라서 newtonsoft.json을 가져올 필요가 없습니다.

다른 옵션은 options.JsonSerializerOptions.PropertyNamingPolicy입니다 JsonNamingPolicy.CamelCase. JsonNamingPolicysnake_case 또는 PascalCase와 같은 다른 이름 지정 정책 옵션 이없는 것 같습니다 .


답변

사용할 수 있습니다 PropertyNameCaseInsensitive. deserializer에 매개 변수로 전달해야합니다.

var json = "{\"firstname\":\"John\",\"lastname\":\"Smith\"}";
var options = new JsonSerializerOptions() { PropertyNameCaseInsensitive = true };
var person = JsonSerializer.Deserialize<Person>(json, options);

어느 ( 문서에서 ) :

역 직렬화 중에 속성 이름에서 대 / 소문자를 구분하지 않는 비교를 사용하는지 여부를 결정하는 값을 가져 오거나 설정합니다. 기본값은 false

따라서 camelCase 또는 PascalCase를 지정하지 않지만 대소 문자를 구분하지 않는 비교를 사용합니다. 이것이 귀하의 요구 사항을 충족하는지 확실하지 않습니다.


참고 : 콘솔 응용 프로그램 에서이 응용 프로그램을 넓게 설정할 수 없었습니다. 에서 언급 한 바와 같이 Kahbazi의 대답 services.AddMvc().AddJsonOptionsservices.AddControllers().AddJsonOptions단지 MVC 및 WebApi 컨트롤러 JSON을 구성합니다 (즉 없습니다 예를 들어, 콘솔 응용 프로그램에서 다양한 JSON 설정 응용 프로그램을 구성합니다). 아래는 컨트롤러 엔드 포인트를 통과 한 Json에 대해서만 System.Text.Json을 구성합니다.

services.AddControllers()
        .AddJsonOptions(options => {
            options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
         }); 


답변

CamelCase 직렬화를 원하면 Startup.cs 에서이 코드를 사용하십시오 (예 : firstName).

services.AddControllers()
        .AddJsonOptions(options =>
        {
            options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
        });

PascalCase 직렬화를 원하면 Startup.cs 에서이 코드를 사용하십시오 (예 : FirstName).

services.AddControllers()
        .AddJsonOptions(options =>
        {
            options.JsonSerializerOptions.PropertyNamingPolicy= null;
        );


답변

이전 Json 시리얼 라이저 구현을 사용할 수있는 Microsoft.AspNetCore.Mvc.NewtonsoftJson Nuget 패키지를 설치하여 응용 프로그램을 계속 넓게 설정할 수 있습니다.

services.AddControllers()
        .AddNewtonsoftJson(options =>
        {
            options.SerializerSettings.ContractResolver = new DefaultContractResolver();
        });

Poke의 크레딧, 여기에 대한 답변 :
IMvcBuilder AddJsonOptions는 .Net Core 3.0에서 어디로 갔습니까?


답변