Thuộc tính JSON giờ đây viết thường khi hoán đổi từ ASP .Net Core 1.0.0-rc2-final sang 1.0.0


90

Tôi vừa hoán đổi dự án của chúng tôi từ ASP .Net Core 1.0.0-rc2-final thành 1.0.0. Trang web và ứng dụng khách của chúng tôi đã ngừng hoạt động do viết hoa các thuộc tính JSON. Ví dụ: dòng JavaScript này hiện không thành công

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

bởi vì bộ điều khiển bây giờ gọi mảng là "items" thay vì "Items". Tôi không thực hiện thay đổi nào ngoài việc cài đặt các gói cập nhật và chỉnh sửa tệp project.json. Tôi đã không thay đổi các tệp mô hình C # vẫn viết hoa các thuộc tính của chúng.

Tại sao bộ điều khiển ASP.Net Core bắt đầu trả về JSON với các thuộc tính có cấu trúc thấp hơn? Làm thế nào để tôi quay lại họ tôn trọng trường hợp của các tên tài sản từ mô hình?



2
Đối với những người đang tìm kiếm câu trả lời cho .Net Core 3, bạn cần cuộn xuống cuối trang.
Mike Devenney

Câu trả lời:


156

MVC hiện đang tuần tự hóa JSON với tên trường hợp lạc đà theo mặc định

Sử dụng mã này để tránh tên trường hợp lạc đà theo mặc định

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

Nguồn: https://github.com/aspnet/Anosystemments/issues/194


8
netcore2: sử dụng Newtonsoft.Json.Serialization;
david.barkhuizen

3
Tôi không muốn thay đổi tất cả tuần tự hóa JSON của mình, chỉ một trường hợp cụ thể cần phù hợp với hoạt động của một số phần mềm bên thứ ba. Làm cách nào để cung cấp cài đặt tuần tự hóa chính xác trong tham số thứ hai của Json()cuộc gọi?
Auspex

79

Trong trường hợp bạn tìm thấy điều này từ Google và đang tìm giải pháp cho Core 3.

Core 3 sử dụng System.Text.Json, theo mặc định không bảo toàn trường hợp. Như đã đề cập với vấn đề GitHub này , việc đặt PropertyNamingPolicythành null sẽ khắc phục sự cố.

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

và nếu bạn không muốn thay đổi cài đặt chung, chỉ với một hành động, nó sẽ như thế này:

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

8
bạn là chúa tể và vị cứu tinh của tôi
Jonty Morris

1
Điều này hoạt động tốt đối với tôi trên Core 3.1. Tôi không thể làm cho các thành phần kiếm đạo của mình hoạt động bình thường và nhận thấy chiếc json được định dạng vỏ lạc đà. Điều này đã giải quyết vấn đề.
Waragi ngày

Tôi cũng là đối tượng của bạn
João Loureiro


9

Đối với những người đã chuyển sang Core 3.1 và có dự án Core MVC có thể sử dụng mã thiết lập sau trong Startup.cs:


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

Điều này giống với câu trả lời trước đó stackoverflow.com/a/58187836/125981
Mark Schultheiss

@MarkSchultheiss có lẽ bạn đúng, vì câu trả lời của tôi tương tự như tất cả những câu khác, tuy nhiên, khi tôi đang tìm kiếm câu trả lời thích hợp dựa trên loại dự án của mình, đó là MVC sử dụng lượt xem, tôi đã không tìm thấy câu trả lời chính xác phù hợp với dự án của mình. AddControllersWithViews () bổ sung những phần còn thiếu đó và tôi nghĩ nó sẽ hữu ích cho bất kỳ ai trong tương lai. Cảm ơn bạn cho bình luận của bạn!
UY

3

Điều này sẽ khắc phục sự cố trong dotnet core 3 webapi, để nó không thay đổi tên thuộc tính của bạn và bạn quay trở lại khách hàng của mình chính xác những gì bạn dự định.

Trong Startup.cs:

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

Điều này giống với câu trả lời trước đó stackoverflow.com/a/58187836/125981
Mark Schultheiss

1

Đối với một số người đang sử dụng ASP.net WEB API (chứ không phải ASP.NET Core).

Thêm dòng này vào WebApiConfig của bạn.

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

jsonFormatter.SerializerSettings.ContractResolver = new DefaultContractResolver();

Thêm điều này làm câu trả lời ở đây vì điều này cũng xuất hiện đầu tiên trong tìm kiếm của google cho web api.


0

Đối với các phiên bản Core 2.x, sử dụng mã này, bạn có thể tránh các tên trường hợp lạc đà theo mặc định. Bạn cần thêm mã sau vào phương thức ConfigureServices của tệp Startup.cs.

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

        castedResolver.NamingStrategy = null;
    }
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.