StringEnumConverter berfungsi sebagai atribut tetapi tidak secara global

Kami menerapkan .NET Core 3.1 API dan kami menggunakan Microsoft.AspNetCore.Mvc.NewtonsoftJson menurut dokumen ini. Kita berurusan dengan enum dan kita memerlukan representasi string, bukan bilangan bulat. Kami melakukannya menggunakan atribut JSONConverter seperti ini:

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

Kami mencoba melakukannya secara global dari Startup.cs seperti di bawah ini:

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

Jika kami melakukan itu, Cosmos DB akan mengeluh

PartitionKey yang diekstraksi dari dokumen tidak cocok dengan yang ditentukan di header

Jadi kami mencoba menghapus semua atribut kecuali atribut wilayah. Semua enum lain yang tidak memiliki atribut disimpan sebagai string dengan benar, namun wilayah tersebut masih memerlukan atribut agar berfungsi. Adakah petunjuk mengapa ini terjadi dan bagaimana cara mengatasinya?


person user33276346    schedule 29.06.2020    source sumber
comment
AddNewtonsoftJson() hanya memengaruhi perilaku default serialisasi JSON inti asp.net dan pengikatan model, tidak memengaruhi perilaku Json.NET standalone atau aplikasi lain. Untuk melakukannya lihat Menetapkan pengaturan json serializer global default.   -  person dbc    schedule 29.06.2020
comment
Itu mengasumsikan bahwa CosmosDB menggunakan pengaturan global JSON.NET. (Jika Anda membuat serializer secara manual menggunakan JsonSerializer.Create() alih-alih JsonSerializer.CreateDefault() global defaultnya diabaikan.) Bisakah Anda edit pertanyaan Anda untuk membagikan contoh minimal yang dapat direproduksi yang menunjukkan cara menghasilkan kesalahan Cosmos DB?   -  person dbc    schedule 29.06.2020
comment
Akan rumit untuk membagikan kodenya, dan itu adalah bagian dari alasan masalah yang Anda bantu saya sadari. Saya memiliki .NET Core API, jadi saya tidak melihat cara mengkonfigurasi Json.NET mandiri pada tingkat yang lebih tinggi daripada Startup. NAMUN, saya menyadari bahwa atribut tersebut digunakan dalam kelas dari proyek yang berbeda ????‍♂️. Saya berencana akhir pekan ini, untuk menambahkan penjelasan ini sebagai jawaban yang mungkin dapat membantu orang lain untuk memperhatikan hal ini, kecuali Anda dapat memberikan lebih banyak wawasan. Terima kasih dbc!   -  person user33276346    schedule 30.06.2020


Jawaban (1)


Di netcore 3.1 atau lebih tinggi, Anda dapat menggunakan JsonStringEnumConverter:

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

Coba Contoh secara online

person M.Hassan    schedule 18.11.2020