IMvcBuilder AddJsonOptions đã đi đâu trong .Net Core 3.0?


119

Tôi vừa nâng cấp dự án API web ASP của mình từ. Net core 2.0đến 3.0. tôi đang sử dụng

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

trước đây để đảm bảo viết hoa thấp hơn của JSON được tuần tự hóa.

Sau khi nâng cấp lên 3.0, tôi gặp lỗi này:

Lỗi CS1061 'IMvcBuilder' không chứa định nghĩa cho 'AddJsonOptions' và không có phương thức mở rộng có thể truy cập 'AddJsonOptions' chấp nhận đối số đầu tiên của loại 'IMvcBuilder' (bạn có thiếu một chỉ thị using hay tham chiếu hội đồng không?)

Theo AddJsonOptions cho MvcJsonOptions trong Asp.Net Core 2.2 , phương thức mở rộng AddJsonOptions được / được cung cấp bởi gói nuget Microsoft.AspNetCore.Mvc.Formatters.Json . Tôi đã thử cài đặt / cài đặt lại điều này nhưng vẫn không thể giải quyết phương pháp. Điều thú vị là intellisense chỉ hiển thị Microsoft.AspNetCore.Mvc.Formatters. Xml khi tôi cố gắng thêm báo cáo kết quả sử dụng mặc dù tôi thêm Json gói NuGet.

Bất cứ ý tưởng những gì đang xảy ra? Các tài liệu cho AddJsonOptions chỉ đi lên đến Net 2.2 vì vậy có lẽ phương pháp này đã được tán thành trong 3,0 ủng hộ của một số cơ chế cấu hình khác?

Câu trả lời:


203

Là một phần của ASP.NET Core 3.0, theo mặc định, nhóm đã loại bỏ Json.NET. Bạn có thể đọc thêm về điều đó nói chung trong thông báo về những thay đổi đột phá đối với Microsoft.AspNetCore.App .

Thay vì Json.NET, ASP.NET Core 3.0 và .NET Core 3.0 bao gồm một API JSON khác tập trung hơn một chút vào hiệu suất. Bạn có thể tìm hiểu thêm về điều đó trong thông báo về “Tương lai của JSON trong .NET Core 3.0” .

Các mẫu mới cho ASP.NET Core sẽ không còn đi kèm với Json.NET nhưng bạn có thể dễ dàng cấu hình lại dự án để sử dụng nó thay vì thư viện JSON mới. Điều này quan trọng đối với cả khả năng tương thích với các dự án cũ hơn và cũng vì thư viện mới không được cho là thay thế hoàn toàn, vì vậy bạn sẽ không thấy toàn bộ tính năng ở đó.

Để cấu hình lại dự án ASP.NET Core 3.0 của bạn với Json.NET, bạn sẽ cần thêm tham chiếu NuGet vào Microsoft.AspNetCore.Mvc.NewtonsoftJson, là gói bao gồm tất cả các bit cần thiết. Sau đó, trong phần Khởi động ConfigureServices, bạn sẽ cần cấu hình MVC như sau:

services.AddControllers()
    .AddNewtonsoftJson();

Điều này thiết lập bộ điều khiển MVC và cấu hình nó để sử dụng Json.NET thay vì API mới đó. Thay vì bộ điều khiển, bạn cũng có thể sử dụng quá tải MVC khác (ví dụ: đối với bộ điều khiển có chế độ xem hoặc trang Dao cạo). AddNewtonsoftJsonPhương thức đó có quá tải cho phép bạn định cấu hình các tùy chọn Json.NET giống như bạn đã quen với AddJsonOptionstrong ASP.NET Core 2.x.

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

41
Đối với những người đang theo dõi ở nhà ... khi di chuyển một dự án, bạn có thể cần thêm một tham chiếu nuget vào "Microsoft.AspNetCore.Mvc.NewtonsoftJson" để nhận phần mở rộng "AddNewtonsoftJson". Tại thời điểm viết bài này, yêu cầu kiểm tra "bao gồm cơ sở tiên quyết" nếu bạn đang sử dụng trình quản lý Visual Studio Nuget.
NeilMacMullen

1
Lưu ý rằng tôi thường không khuyên bạn nên chuyển sang ASP.NET Core 3 với các ứng dụng thực tế. Nếu bạn chỉ muốn chơi xung quanh, chắc chắn, nhưng vẫn còn một số điểm chuyển động trước khi phát hành cuối cùng, vì vậy bạn sẽ phải ghi nhớ điều đó nếu bạn muốn chuyển sang nó sớm.
poke

1
Điều này có thể kích hoạt "Hoạt động đồng bộ không được phép", hãy kiểm tra stackoverflow.com/questions/47735133/… để biết thêm thông tin
verbedr

8
Đối với tôi AddNewtonsoftJsonlà thiếu, ngay cả sau khi tham khảo tài liệu tham khảo đó Microsoft.AspNetCore.Mvc.NewtonsoftJson.
Saeed Neamati

2
@avenmore Bộ tuần tự mới sử dụng một tập hợp các thuộc tính riêng biệt. Bạn có thể sử dụng [JsonIgnore]từ System.Text.Json.Serializationkhông gian tên.
poke

21

Điều này đã làm việc cho tôi, trong khi sử dụng .Net Core 3:

services.AddMvc().AddJsonOptions(o =>
{
    o.JsonSerializerOptions.PropertyNamingPolicy = null;
    o.JsonSerializerOptions.DictionaryKeyPolicy = null;
});

Tôi giả sử dòng phải là:o.JsonSerializerOptions.PropertyNameCaseInsensitive = false;
Grandizer.

1
Vâng, tôi cũng vậy, nhưng nó không. Câu trả lời này đã làm việc cho tôi mặc dù.
Martin

2
Không cần o.JsonSerializerOptions.DictionaryKeyPolicy = null;o.JsonSerializerOptions.PropertyNameCaseInsensitive = false;
Shahar Shokrani

Tôi ước tôi có thể sử dụng câu trả lời này, nhưng ứng dụng của tôi được xây dựng bằng cách sử dụng các thuộc tính Newtonsoft, mà bộ tuần tự MS mới bỏ qua, có nghĩa là tôi phải tiếp tục sử dụng bộ tuần tự Newtonsoft với AddNewtonsoftJson. Có lẽ MS có thể thêm một tùy chọn để tôn trọng các thuộc tính của Newtonsoft, trong khi vẫn nhận được hiệu suất mà họ đang hứa hẹn.
Eric

@eric Có bạn đúng nhưng, hiệu suất của Newtonsoft là đủ cho hầu hết các trường hợp.
Mohammad Olfatmiri

0

Điều này sẽ giúp

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

            });

            services.AddDbContext<PaymentDetailContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DevConnection")));
        }
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.