ASP.NET Core 3.0 System.Text.Json Camel Case 직렬화


19

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를 어떻게 설정할 수 있습니까?

감사!

답변:


25

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);

System.Text.Json을 사용하여 전체 프로젝트 / 응용 프로그램에 대해 직렬화 옵션을 지정하는 방법이 없습니까? 이 System.Text.Json 전에 사소한이었다
알렉산더 Staroselsky

나는 그렇게 생각하지 않습니다. 설정을 전달해야합니다
Kahbazi


11

에서 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와 같은 다른 이름 지정 정책 옵션 이없는 것 같습니다 .


이것은 나를 위해 일했습니다. FTR,이 전에 내 서비스에 .AddMvc ()가 없었으므로 AddJsonOptions를 추가 할 수 있습니다. 모든 서버-클라이언트 직렬화 문제가 사라졌습니다 .....
Mark Lazz

10

사용할 수 있습니다 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;
         }); 

6

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;
        );

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.