StringEnumConverter ทำงานเป็นแอตทริบิวต์แต่ไม่ใช่แบบสากล

เรากำลังใช้ .NET Core 3.1 API และเรากำลังใช้ Microsoft.AspNetCore.Mvc.NewtonsoftJson ตาม เอกสารนี้ เรากำลังจัดการกับ enum และเราต้องการการแสดงสตริงแทนจำนวนเต็ม เรากำลังดำเนินการโดยใช้แอตทริบิวต์ JsonConverter ดังนี้:

[JsonProperty("region")]
[JsonConverter(typeof(StringEnumConverter))]
public Region Region { get; set; }

เรากำลังพยายามทำสิ่งนี้ทั่วโลกจาก Startup.cs ดังนี้:

services.AddControllers().AddNewtonsoftJson(opts => opts.SerializerSettings.Converters.Add(new StringEnumConverter()));

ถ้าเราทำเช่นนั้น Cosmos DB ก็กำลังบ่นอยู่

PartitionKey ที่ดึงมาจากเอกสารไม่ตรงกับที่ระบุไว้ในส่วนหัว

ดังนั้นเราจึงพยายามลบคุณลักษณะทั้งหมดยกเว้นภูมิภาคหนึ่ง enum อื่นๆ ทั้งหมดที่ไม่มีแอตทริบิวต์จะถูกจัดเก็บเป็นสตริงอย่างถูกต้อง แต่ขอบเขตยังคงต้องการให้แอตทริบิวต์ทำงาน มีเบาะแสใด ๆ ว่าทำไมสิ่งนี้ถึงเกิดขึ้นและจะแก้ไขได้อย่างไร?


person user33276346    schedule 29.06.2020    source แหล่งที่มา
comment
AddNewtonsoftJson() ส่งผลต่อพฤติกรรมเริ่มต้นของการจัดอนุกรม JSON ของ asp.net core และการเชื่อมโยงโมเดลเท่านั้น โดยจะไม่ส่งผลต่อพฤติกรรมของ Json.NET สแตนด์อโลน หรือแอปอื่นๆ หากต้องการดำเนินการดังกล่าว โปรดดูตั้งค่าเริ่มต้นของการตั้งค่า json serializer ส่วนกลาง   -  person dbc    schedule 29.06.2020
comment
ถือว่า CosmosDB ใช้การตั้งค่าส่วนกลางของ Json.NET (หากคุณสร้างซีเรียลไลเซอร์ด้วยตนเองโดยใช้ JsonSerializer.Create() แทนที่จะเป็น JsonSerializer.CreateDefault() global ค่าเริ่มต้นจะถูกละเว้น) โปรดแก้ไขคำถามของคุณเพื่อแบ่งปัน ตัวอย่างที่ทำซ้ำได้น้อยที่สุด แสดงวิธีสร้างข้อผิดพลาด Cosmos DB   -  person dbc    schedule 29.06.2020
comment
การแบ่งปันโค้ดคงจะยุ่งยาก และนั่นเป็นส่วนหนึ่งของสาเหตุของปัญหาที่คุณช่วยให้ฉันตระหนัก ฉันมี .NET Core API ดังนั้นฉันจึงไม่เห็นวิธีกำหนดค่า Json.NET แบบสแตนด์อโลนในระดับที่สูงกว่าสตาร์ทอัพ อย่างไรก็ตาม ฉันพบว่าแอตทริบิวต์ถูกใช้ในคลาสจากโปรเจ็กต์อื่น ????‍♂️ ฉันวางแผนสุดสัปดาห์นี้ เพื่อเพิ่มคำอธิบายนี้เป็นคำตอบเพื่อช่วยให้ผู้อื่นสนใจเรื่องนี้ เว้นแต่ว่าคุณจะสามารถให้ข้อมูลเชิงลึกเพิ่มเติมได้ ขอบคุณ ดีบีซี!   -  person user33276346    schedule 30.06.2020


คำตอบ (1)


ใน netcore 3.1 หรือสูงกว่า คุณสามารถใช้ JsonStringEnumConverter ได้:

 var options = new JsonSerializerOptions
        {            
            Converters = { new JsonStringEnumConverter() },
             //other options
        };

ลองใช้ตัวอย่างทางออนไลน์

person M.Hassan    schedule 18.11.2020