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

방금 프로젝트를 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을 반환하기 시작한 이유는 무엇입니까? 모델에서 속성 이름의 대소 문자를 존중하는 방법으로 돌아가려면 어떻게해야합니까?



답변

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

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

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

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


답변

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


답변

다음과 같이 동작을 변경할 수 있습니다.

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

https://github.com/aspnet/Announcements/issues/194 에서 발표 내용을 참조하십시오.


답변

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


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


답변

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

Startup.cs에서 :

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


답변

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

WebApiConfig에이 줄을 추가합니다.

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

jsonFormatter.SerializerSettings.ContractResolver = new DefaultContractResolver();

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


답변

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