Làm cách nào để cài đặt json serializer trong asp.net core 3?


29

thiết lập serializer json cho các ứng dụng cốt lõi di sản asp.net đã được thiết lập bằng cách thêm AddMvc().AddJsonOptions(), nhưng tôi không sử dụng AddMvc()trong asp.net core 3. Vì vậy, làm thế nào tôi có thể thiết lập cài đặt nối tiếp json toàn cầu?


Nếu bạn không sử dụng AddMvc, những gì làm bạn sử dụng không? Bạn đang sử dụng ví dụ AddControllershay bạn hoàn toàn không sử dụng MVC?
Kirk Larkin

@KirkLarkin tôi sử dụng cách mặc định để xây dựng ứng dụng asp.net core 3 - app.UseEndpoints(endpoints => { endpoints.MapControllers() })services.AddControllers();
Alex Zaitsev

Được rồi, vì vậy tôi đoán bạn đang sử dụng AddControllerstrong ConfigureServices, phải không?
Kirk Larkin

@KirkLarkin, yeah, phải
Alex Zaitsev

Câu trả lời:


27

AddMvctrả về một IMvcBuildertriển khai, trong đó có một AddJsonOptionsphương thức mở rộng tương ứng . Các phương pháp kiểu mới AddControllers, AddControllersWithViewsAddRazorPagescũng trả về một IMvcBuilderthực hiện. Xâu chuỗi với những thứ này giống như cách bạn xâu chuỗi với AddMvc:

services.AddControllers()
    .AddJsonOptions(options =>
    {
        // ...
    });

Lưu ý rằng optionsở đây không còn dành cho Json.NET, mà dành cho các System.Text.JsonAPI mới hơn . Nếu bạn vẫn muốn sử dụng Json.NET, hãy xem câu trả lời của tymtam



Thêm "tùy chọn.JsonSerializerOptions.IgnoreNullValues ​​= true;" không có hiệu lực
zion

1
Đối với những người khác truy cập trang này đang tìm kiếm chuyển đổi Enum: [JsonConverter (typeof (JsonStringEnumConverter))] enum công khai Một sốEnum
Rafał Praniuk

23

Tùy chọn A. AddControllers

Đây vẫn là MVC và yêu cầu gói nuget Microsoft.AspNetCore.Mvc.NewtonsoftJson, nhưng bạn nói bạn sử dụng AddControllers.

Từ Add Newtonsoft.Json hỗ trợ định dạng JSON dựa trên

services.AddControllers().AddNewtonsoftJson(options =>
{
    // Use the default property (Pascal) casing
    options.SerializerSettings.ContractResolver = new DefaultContractResolver();

    // Configure a custom converter
    options.SerializerOptions.Converters.Add(new MyCustomJsonConverter());
});

Tùy chọn B. Cài đặt mặc định

JsonConvert.DefaultSettings = () => new JsonSerializerSettings (...)

Thuộc tính JsonConvert.DefaultSinstall

Nhận hoặc đặt một hàm tạo JsonSerializerS Settings mặc định. Cài đặt mặc định được tự động sử dụng bởi các phương thức tuần tự hóa trên JsonConvert và ToObject () và FromObject (Object) trên JToken. Để tuần tự hóa mà không sử dụng bất kỳ cài đặt mặc định nào, hãy tạo JsonSerializer bằng Tạo ().


Xin chào, điều này đặt cài đặt ở cấp độ Json.NET, làm thế nào để thực hiện ở cấp ASP.NET?
Alex Zaitsev

Nó cấu hình các cài đặt ở mức ASP.NET, có nghĩa là ModelBinding mặc định bây giờ xảy ra bằng cách sử dụng serializer NewtonsoftJson.
MrClan

Cảm ơn bạn, Lựa chọn A đã làm việc cho tôi. Đã nâng cấp từ 2.2 lên 3.1 và điểm cuối của tôi bị System.Text.Jsonhỏng vì không xử lý đa hình hoặc enum đúng cách. Đẹp dễ dàng để thay đổi serializer mặc định.
static_void

15

Việc thêm Newtonsoft là không cần thiết, khá là vấn đề với việc thêm các gói tương thích Newtonsoft trong dự án .Net Core 3.0.

Xem thêm https://github.com/aspnet/AspNetCore/issues/13564

Tất nhiên, người ta sẽ kỷ niệm đặt tên tài sản PascalCase, NA vào lúc này ... Vì vậy, nullđối với PropertyNamingPolicyphương tiện PascalCase, mà rõ ràng là không phải là rất tốt.

// Pascal casing
services.AddControllersWithViews().
        AddJsonOptions(options =>
        {
            options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
            options.JsonSerializerOptions.PropertyNamingPolicy = 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.