이제 JSON 속성은 ASP .Net Core 1.0.0-rc2-final에서 1.0.0으로 스왑시 소문자


90

방금 프로젝트를 ASP .Net Core 1.0.0-rc2-final에서 1.0.0으로 바꿨습니다. JSON 속성의 대문자로 인해 웹 사이트와 클라이언트가 작동을 멈췄습니다. 예를 들어이 자바 스크립트 줄은 이제 실패합니다.

for (var i = 0; i < collection.Items.length; i++){

컨트롤러는 이제 "Items"대신 "items"배열을 호출하기 때문입니다. 업데이트 된 패키지를 설치하고 project.json 파일을 편집하는 것 외에는 변경하지 않았습니다. 여전히 속성을 대문자로 사용하는 C # 모델 파일을 변경하지 않았습니다.

ASP.Net Core 컨트롤러가 소문자 속성으로 JSON을 반환하기 시작한 이유는 무엇입니까? 모델에서 속성 이름의 대소 문자를 존중하는 방법으로 돌아가려면 어떻게해야합니까?



2
.Net Core 3에 대한 답을 찾는 사람들은 페이지 하단으로 스크롤해야합니다.
Mike Devenney

답변:


156

MVC는 이제 기본적으로 낙타 케이스 이름으로 JSON을 직렬화합니다.

이 코드를 사용하여 기본적으로 카멜 케이스 이름을 피하십시오.

  services.AddMvc()
        .AddJsonOptions(options => options.SerializerSettings.ContractResolver = new DefaultContractResolver());

출처 : https://github.com/aspnet/Announcements/issues/194


8
netcore2 : Newtonsoft.Json.Serialization 사용;
david.barkhuizen

3
일부 타사 소프트웨어의 동작과 일치해야하는 특정 경우에만 JSON 직렬화를 모두 변경하고 싶지 않습니다 . Json()호출 의 두 번째 매개 변수에 올바른 직렬화 설정을 제공하는 방법은 무엇입니까?
Auspex 2018

79

Google에서 이것을 발견하고 Core 3에 대한 솔루션을 찾고있는 경우

Core 3은 System.Text.Json기본적으로 대소 문자를 보존하지 않는를 사용합니다. 이 GitHub 문제 에서 언급 했듯이을PropertyNamingPolicy null로 설정 하면 문제가 해결됩니다.

public void ConfigureServices(IServiceCollection services)
{
...
    services.AddControllers()
            .AddJsonOptions(opts => opts.JsonSerializerOptions.PropertyNamingPolicy = null);

전역 설정을 변경하지 않으려면 한 작업에 대해서만 다음과 같습니다.

return Json(obj, new JsonSerializerOptions { PropertyNamingPolicy = null });

8
당신은 나의 주님이자 구세주입니다
Jonty Morris

1
이것은 Core 3.1에서 잘 작동했습니다. 검도 구성 요소가 제대로 작동하지 않았고 json이 카멜 케이스 형식이라는 것을 알았습니다. 이것은 문제를 해결했습니다.
Waragi

나는 또한 당신의 주제입니다
João Loureiro


9

Core 3.1로 마이그레이션하고 Core MVC 프로젝트가있는 사용자는 Startup.cs에서 다음 설정 코드를 사용할 수 있습니다.


        public void ConfigureServices(IServiceCollection services)
        {
            ...
            services.AddControllersWithViews().AddJsonOptions(opts => opts.JsonSerializerOptions.PropertyNamingPolicy = null);
            ...
        }

이것은 이전 답변과 동일합니다. stackoverflow.com/a/58187836/125981
Mark Schultheiss

내 대답은 다른 모든 대답과 비슷하기 때문에 @MarkSchultheiss 당신이 옳을 것입니다. AddControllersWithViews ()는 그 누락 된 부분을 추가하고 앞으로 누구에게나 유용 할 것이라고 생각했습니다. 귀하의 의견에 감사드립니다!
UY

3

이렇게하면 dotnet core 3 webapi에서 수정되므로 속성 이름이 전혀 변경되지 않고 의도 한대로 클라이언트로 돌아갑니다.

Startup.cs에서 :

public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers().AddJsonOptions(options => options.JsonSerializerOptions.PropertyNamingPolicy = null);
        services.AddHttpClient();
    }

이것은 이전 답변과 동일합니다. stackoverflow.com/a/58187836/125981
Mark Schultheiss

1

ASP.NET Web API (ASP.NET Core가 아닌)를 사용하는 일부 사용자에게 적합합니다.

WebApiConfig에이 줄을 추가합니다.

//Comment this jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();

jsonFormatter.SerializerSettings.ContractResolver = new DefaultContractResolver();

웹 API에 대한 Google 검색에서도 처음으로 나오기 때문에 여기에 답변으로 추가하십시오.


0

Core 2.x 버전의 경우이 코드를 사용하면 기본적으로 카멜 케이스 이름을 피할 수 있습니다. Startup.cs 파일의 ConfigureServices 메서드에 다음 코드를 추가해야합니다.

services.AddMvc()
.AddJsonOptions(o =>
{
    if (o.SerializerSettings.ContractResolver != null)
    {
        var castedResolver = o.SerializerSettings.ContractResolver
        as DefaultContractResolver;

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