คุณสมบัติ JSON ตอนนี้ตัวพิมพ์เล็กบน swap จาก ASP .Net Core 1.0.0-rc2-final เป็น 1.0.0


92

ฉันเพิ่งเปลี่ยนโปรเจ็กต์ของเราจาก ASP .Net Core 1.0.0-rc2-final เป็น 1.0.0 เว็บไซต์และลูกค้าของเราหยุดทำงานเนื่องจากใช้คุณสมบัติ JSON เป็นตัวพิมพ์ใหญ่ ตัวอย่างเช่นตอนนี้ JavaScript บรรทัดนี้ล้มเหลว

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

เนื่องจากขณะนี้คอนโทรลเลอร์เรียกอาร์เรย์ว่า "items" แทน "Items" ฉันไม่ได้ทำการเปลี่ยนแปลงใด ๆ นอกเหนือจากการติดตั้งแพ็คเกจที่อัปเดตและแก้ไขไฟล์ project.json ฉันไม่ได้เปลี่ยนไฟล์โมเดล C # ซึ่งยังคงใช้ประโยชน์จากคุณสมบัติของมัน

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



2
สำหรับผู้ที่กำลังมองหาคำตอบสำหรับ. Net Core 3 คุณต้องเลื่อนลงไปที่ด้านล่างของหน้า
Mike Devenney

คำตอบ:


159

ตอนนี้ MVC จัดลำดับ JSON ด้วยชื่อเคสอูฐตามค่าเริ่มต้น

ใช้รหัสนี้เพื่อหลีกเลี่ยงชื่อเคสอูฐตามค่าเริ่มต้น

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

ที่มา: https://github.com/aspnet/Announcements/issues/194


8
netcore2: ใช้ Newtonsoft.Json.Serialization;
david.barkhuizen

3
ฉันไม่ต้องการเปลี่ยนการทำให้อนุกรม JSON ทั้งหมดของฉันมีเพียงกรณีเดียวที่ต้องตรงกับลักษณะการทำงานของซอฟต์แวร์ของบุคคลที่สาม วิธีหนึ่งให้การตั้งค่าการทำให้เป็นอนุกรมที่ถูกต้องในพารามิเตอร์ที่สองของการJson()โทรอย่างไร
Auspex

82

ในกรณีที่คุณพบสิ่งนี้จาก Google และกำลังมองหาวิธีแก้ปัญหาสำหรับ Core 3

Core 3 ใช้System.Text.Jsonซึ่งโดยค่าเริ่มต้นจะไม่เก็บเคส ตามที่กล่าวไว้ในปัญหา GitHub นี้การตั้งค่าเป็นPropertyNamingPolicynull จะช่วยแก้ปัญหาได้

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

และหากคุณไม่ต้องการเปลี่ยนการตั้งค่าส่วนกลางสำหรับการดำเนินการเพียงครั้งเดียวมันจะเป็นดังนี้:

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

8
คุณคือเจ้านายและผู้ช่วยให้รอดของฉัน
Jonty Morris

1
สิ่งนี้ใช้ได้ดีสำหรับฉันใน Core 3.1 ฉันไม่สามารถทำให้ส่วนประกอบ kendo ของฉันทำงานได้อย่างถูกต้องและพบว่า json ถูกฟอร์แมตเคสอูฐ วิธีนี้ช่วยแก้ปัญหาได้
Waragi

ฉันก็เรื่องของคุณเช่นกัน
João Loureiro


10

สำหรับผู้ที่ย้ายไปยัง Core 3.1 และมีโปรเจ็กต์ Core MVC สามารถใช้โค้ดการตั้งค่าต่อไปนี้ใน Startup.cs:


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

นี่เหมือนกับคำตอบก่อนหน้า stackoverflow.com/a/58187836/125981
Mark Schultheiss

@MarkSchultheiss คุณอาจจะถูกเพราะคำตอบของฉันคล้ายกับคำตอบอื่น ๆ อย่างไรก็ตามเมื่อฉันค้นหาคำตอบที่เหมาะสมตามประเภทโครงการของฉันซึ่งเป็น MVC ที่ใช้มุมมองฉันไม่พบคำตอบที่ตรงกับโครงการของฉัน AddControllersWithViews () เพิ่มชิ้นส่วนที่ขาดหายไปและฉันคิดว่ามันจะมีประโยชน์สำหรับทุกคนในอนาคต ขอบคุณสำหรับความคิดเห็นของคุณ!
UY

3

สิ่งนี้จะแก้ไขใน dotnet core 3 webapi เพื่อที่จะไม่เปลี่ยนชื่อคุณสมบัติของคุณเลยและคุณกลับไปหาลูกค้าของคุณตามที่คุณต้องการ

ใน Startup.cs:

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

นี่เหมือนกับคำตอบก่อนหน้าstackoverflow.com/a/58187836/125981
Mark Schultheiss

1

สำหรับผู้ที่ใช้ ASP.net WEB API (แทนที่จะเป็น ASP.NET Core)

เพิ่มบรรทัดนี้ใน WebApiConfig ของคุณ

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

jsonFormatter.SerializerSettings.ContractResolver = new DefaultContractResolver();

เพิ่มสิ่งนี้เป็นคำตอบที่นี่เพราะสิ่งนี้เกิดขึ้นก่อนในการค้นหา google สำหรับ web api เช่นกัน


0

สำหรับเวอร์ชัน Core 2.x การใช้รหัสนี้คุณสามารถหลีกเลี่ยงชื่อเคสอูฐได้ตามค่าเริ่มต้น คุณต้องเพิ่มโค้ดต่อไปนี้ภายในเมธอด ConfigureServices ของไฟล์ Startup.cs

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

        castedResolver.NamingStrategy = null;
    }
});

0

สำหรับผู้ที่ไม่ต้องการตั้งค่าทั่วโลกสามารถใช้ ContractResolver เพื่อส่งคืนเป็นผลลัพธ์ Json:

public IActionResult MyMethod()
{
    var obj = new {myValue = 1};
    return Json(obj, new JsonSerializerSettings {ContractResolver = new DefaultContractResolver()});
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.