วิธีการตั้งค่า json serializer ใน asp.net core 3


29

การตั้งค่า JSON serializer สำหรับการใช้งานหลักมรดก asp.net ถูกกำหนดโดยการเพิ่มAddMvc().AddJsonOptions()แต่ฉันไม่ได้ใช้ในAddMvc() asp.net core 3ดังนั้นฉันจะตั้งค่าการปรับให้เป็น json สากลได้อย่างไร


หากคุณไม่ได้ใช้AddMvcสิ่งที่ทำคุณใช้? คุณใช้AddControllersอยู่หรือไม่ใช้ MVC เลย?
Kirk Larkin

@ KirkLarkin ฉันใช้วิธีเริ่มต้นในการสร้างแอป asp.net core 3 - app.UseEndpoints(endpoints => { endpoints.MapControllers() })และservices.AddControllers();
Alex Zaitsev

เอาล่ะฉันคิดว่าคุณกำลังใช้AddControllersอยู่ConfigureServicesใช่ไหม
Kirk Larkin

@ KirkLarkin ใช่ถูกต้อง
Alex Zaitsev

คำตอบ:


27

AddMvcส่งคืนการIMvcBuilderใช้งานซึ่งมีAddJsonOptionsวิธีการขยายที่สอดคล้องกัน วิธีการแบบใหม่ AddControllers, AddControllersWithViewsและAddRazorPagesยังกลับIMvcBuilderการดำเนินงาน เชื่อมโยงกับสิ่งเหล่านี้ในลักษณะเดียวกับที่คุณเชื่อมโยงกับAddMvc:

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

โปรดทราบว่าที่optionsนี่ไม่ได้มีไว้สำหรับ Json.NET อีกต่อไป แต่สำหรับSystem.Text.JsonAPI ที่ใหม่กว่า หากคุณยังต้องการใช้ Json.NET ดูคำตอบของ tymtam



การเพิ่ม "options.JsonSerializerOptions.IgnoreNullValues ​​= true;" ไม่มีผล
Zion

1
ถึงผู้อื่นที่กดปุ่มหน้านี้เพื่อค้นหาการแปลง Enum: [JsonConverter (typeof (JsonStringEnumConverter))] public enum SomeEnum
Rafał Praniuk

23

ตัวเลือก A. AddControllers

นี้ยังคงเป็น MVC และต้องใช้แพคเกจ Microsoft.AspNetCore.Mvc.NewtonsoftJson nuget AddControllersแต่คุณบอกว่าคุณใช้

จากการสนับสนุนรูปแบบ JSON ตามรูปแบบเพิ่ม Newtonsoft.Json

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

ตัวเลือก B. DefaultSettings

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

คุณสมบัติ JsonConvert.DefaultSettings

ได้รับหรือการตั้งค่าฟังก์ชั่นที่สร้าง JsonSerializerSettings เริ่มต้น การตั้งค่าเริ่มต้นจะใช้โดยอัตโนมัติโดยวิธีการเป็นอันดับใน JsonConvert และ ToObject () และ FromObject (Object) บน JToken ในการทำให้เป็นอนุกรมโดยไม่ใช้การตั้งค่าเริ่มต้นใด ๆ ให้สร้าง JsonSerializer ด้วย Create ()


สวัสดีนี่เป็นการตั้งค่าในระดับ Json.NET จะทำอย่างไรในระดับ ASP.NET
Alex Zaitsev

มันกำหนดการตั้งค่าในระดับ ASP.NET ซึ่งหมายถึง ModelBinding เริ่มต้นตอนนี้เกิดขึ้นโดยใช้ serializer NewtonsoftJson
MrClan

ขอบคุณตัวเลือก A ใช้งานได้สำหรับฉัน อัปเกรดจาก 2.2 เป็น 3.1 และจุดสิ้นสุดของฉันแตกเนื่องจากSystem.Text.Jsonไม่จัดการ polymorphism หรือ enums อย่างถูกต้อง วิธีง่าย ๆ ที่ดีในการเปลี่ยน serializer เริ่มต้น
static_void

15

ไม่จำเป็นต้องเพิ่ม Newtonsoft ค่อนข้างมีปัญหากับการเพิ่มแพ็คเกจที่เข้ากันได้กับ Newtonsoft ในโครงการ. Net Core 3.0

ดูเพิ่มเติมที่https://github.com/aspnet/AspNetCore/issues/13564

แน่นอนหนึ่งจะเฉลิมฉลองการตั้งชื่อสถานที่ให้บริการPascalCase, NA ในขณะนี้ ... ดังนั้นnullสำหรับPropertyNamingPolicyวิธี PascalCase ซึ่งจะเห็นได้ชัดไม่ดีมาก

// Pascal casing
services.AddControllersWithViews().
        AddJsonOptions(options =>
        {
            options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
            options.JsonSerializerOptions.PropertyNamingPolicy = null;
        });
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.