IMvcBuilder AddJsonOptions ไปอยู่ที่ไหนใน. Net Core 3.0


122

ฉันเพิ่งอัปเกรดโครงการ ASP web API จากไฟล์. Net core 2.0ถึง3.0. ฉันใช้

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

ก่อนหน้านี้เพื่อให้แน่ใจว่าปลอกล่างของ JSON แบบอนุกรม

หลังจากอัปเกรดเป็น 3.0 ฉันได้รับข้อผิดพลาดนี้:

ข้อผิดพลาด CS1061 'IMvcBuilder' ไม่มีคำจำกัดความสำหรับ 'AddJsonOptions' และไม่มีวิธีการขยายที่สามารถเข้าถึงได้ 'AddJsonOptions' ที่ยอมรับอาร์กิวเมนต์แรกของประเภท 'IMvcBuilder' (คุณไม่มีคำสั่งโดยใช้การอ้างอิงหรือการอ้างอิงแอสเซมบลีหรือไม่)

ตามAddJsonOptions สำหรับ MvcJsonOptions ใน Asp.Net Core 2.2วิธีการขยาย AddJsonOptions ได้รับการจัดเตรียมโดยแพคเกจMicrosoft.AspNetCore.Mvc.Formatters.Json nuget ฉันได้ลองติดตั้ง / ติดตั้งใหม่แล้ว แต่ยังไม่สามารถแก้ไขวิธีนี้ได้ ที่น่าสนใจ intellisense แสดงเฉพาะ Microsoft.AspNetCore.Mvc.Formatters Xmlเมื่อฉันพยายามเพิ่มคำสั่งใช้แม้ว่าฉันจะเพิ่มแพ็คเกจJson nuget

มีความคิดอะไรเกิดขึ้น? เอกสารสำหรับAddJsonOptionsเพียงไปถึงสุทธิ 2.2 ดังนั้นบางทีวิธีการที่ได้รับการคัดค้านใน 3.0 ในความโปรดปรานของกลไกการกำหนดค่าอื่น ๆ ?

คำตอบ:


211

ในฐานะส่วนหนึ่งของ ASP.NET Core 3.0 ทีมได้ย้ายออกจากการรวม Json.NET ตามค่าเริ่มต้น คุณสามารถอ่านเพิ่มเติมเกี่ยวกับที่โดยทั่วไปในประกาศเกี่ยวกับการเปลี่ยนแปลงที่จะหมด Microsoft.AspNetCore.App

แทนที่จะเป็น Json.NET, ASP.NET Core 3.0 และ. NET Core 3.0 จะรวม JSON API อื่นที่เน้นประสิทธิภาพมากกว่าเดิม คุณสามารถเรียนรู้เพิ่มเติมได้ในประกาศเกี่ยวกับ“ อนาคตของ JSON ใน. NET Core 3.0”3.0”

เทมเพลตใหม่สำหรับ ASP.NET Core จะไม่รวมกับ Json.NET อีกต่อไป แต่คุณสามารถกำหนดค่าโครงการใหม่เพื่อใช้แทนไลบรารี JSON ใหม่ได้อย่างง่ายดาย นี่เป็นสิ่งสำคัญสำหรับทั้งความเข้ากันได้กับโปรเจ็กต์เก่าและเนื่องจากไลบรารีใหม่ไม่ควรถูกแทนที่ทั้งหมดดังนั้นคุณจะไม่เห็นฟีเจอร์ทั้งหมดที่ตั้งไว้ที่นั่น

ในการกำหนดค่าโครงการ ASP.NET Core 3.0 ของคุณใหม่ด้วย Json.NET คุณจะต้องเพิ่มการอ้างอิง NuGet Microsoft.AspNetCore.Mvc.NewtonsoftJsonซึ่งเป็นแพ็คเกจที่มีบิตที่จำเป็นทั้งหมด จากนั้นใน Startup ConfigureServicesคุณจะต้องกำหนดค่า MVC ดังนี้:

services.AddControllers()
    .AddNewtonsoftJson();

สิ่งนี้จะตั้งค่าตัวควบคุม MVC และกำหนดค่าให้ใช้ Json.NET แทน API ใหม่นั้น แทนที่จะใช้คอนโทรลเลอร์คุณยังสามารถใช้ MVC overload อื่นได้ (เช่นสำหรับคอนโทรลเลอร์ที่มีมุมมองหรือเพจ Razor) AddNewtonsoftJsonวิธีดังกล่าวมีการโอเวอร์โหลดที่ช่วยให้คุณสามารถกำหนดค่าตัวเลือก Json.NET เหมือนที่คุณคุ้นเคยAddJsonOptionsใน ASP.NET Core 2.x

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

42
สำหรับผู้ที่ติดตามไปที่บ้าน ... เมื่อย้ายโปรเจ็กต์คุณอาจต้องเพิ่มการอ้างอิง nuget ไปที่ "Microsoft.AspNetCore.Mvc.NewtonsoftJson" เพื่อรับส่วนขยาย "AddNewtonsoftJson" ในขณะที่เขียนสิ่งนี้จำเป็นต้องมีการตรวจสอบ "รวม prereleases" หากคุณกำลังใช้ตัวจัดการ Visual Studio Nuget
NeilMacMullen

1
โปรดทราบว่าโดยทั่วไปฉันไม่แนะนำให้ย้ายไปยัง ASP.NET Core 3 ด้วยแอปพลิเคชันจริง หากคุณต้องการเล่นรอบ ๆ แน่นอน แต่ยังมีบิตที่เคลื่อนไหวอยู่เล็กน้อยก่อนที่จะมีการเปิดตัวครั้งสุดท้ายดังนั้นคุณจะต้องระลึกไว้เสมอหากคุณต้องการย้ายไปก่อน
โผล่

1
สิ่งนี้สามารถทริกเกอร์ "การทำงานแบบซิงโครนัสไม่ได้รับอนุญาต" ตรวจสอบstackoverflow.com/questions/47735133/…สำหรับข้อมูลเพิ่มเติม
verbedr

8
สำหรับฉันAddNewtonsoftJsonหายไปแม้ว่าจะอ้างถึงข้อมูลอ้างอิงนั้นMicrosoft.AspNetCore.Mvc.NewtonsoftJsonแล้วก็ตาม
Saeed Neamati

2
@avenmore serializer ใหม่ใช้ชุดแอตทริบิวต์แยกต่างหาก คุณสามารถใช้[JsonIgnore]จากSystem.Text.Json.Serializationเนมสเปซ
โผล่

22

สิ่งนี้ใช้ได้ผลสำหรับฉันในขณะที่ใช้.Net Core 3:

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

ฉันคิดว่าบรรทัดควรจะเป็น:o.JsonSerializerOptions.PropertyNameCaseInsensitive = false;
Grandizer

1
ใช่ฉันด้วย แต่ก็ไม่ได้ คำตอบนี้ใช้ได้ผลสำหรับฉัน
Martin

2
ไม่จำเป็นo.JsonSerializerOptions.DictionaryKeyPolicy = null;และo.JsonSerializerOptions.PropertyNameCaseInsensitive = false;
Shahar Shokrani

ฉันหวังว่าฉันจะใช้คำตอบนี้ได้ แต่แอปพลิเคชันของฉันสร้างขึ้นโดยใช้แอตทริบิวต์ Newtonsoft ซึ่งตัวต่ออนุกรม MS ใหม่ไม่สนใจหมายความว่าฉันต้องใช้ตัวต่ออนุกรม Newtonsoft กับ AddNewtonsoftJson ต่อไป บางที MS อาจเพิ่มตัวเลือกเพื่อเคารพคุณสมบัติของ Newtonsoft ในขณะที่ยังคงได้รับประสิทธิภาพที่เพิ่มขึ้นตามที่มีแนวโน้ม
Eric

@eric ใช่คุณพูดถูก แต่ประสิทธิภาพของ Newtonsoft นั้นเพียงพอสำหรับสถานการณ์ส่วนใหญ่
Mohammad Olfatmiri

0

สิ่งนี้จะช่วยได้

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")));
        }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.