Properti JSON sekarang menggunakan huruf kecil untuk swap dari ASP .Net Core 1.0.0-rc2-final ke 1.0.0

90

Saya baru saja menukar proyek kami dari ASP .Net Core 1.0.0-rc2-final menjadi 1.0.0. Situs web dan klien kami telah berhenti berfungsi karena kapitalisasi properti JSON. Misalnya, baris JavaScript ini sekarang gagal

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

karena pengontrol sekarang memanggil array "items" dan bukan "Items". Saya tidak membuat perubahan apa pun selain menginstal paket yang diperbarui dan mengedit file project.json. Saya belum mengubah file model C # yang masih memanfaatkan propertinya.

Mengapa pengontrol ASP.Net Core mulai mengembalikan JSON dengan properti bertingkat rendah? Bagaimana saya kembali kepada mereka untuk menghormati kasus nama properti dari model?

dumbledad
sumber
2
Bagi Anda yang mencari jawaban untuk .Net Core 3, Anda perlu menggulir ke bawah ke bagian bawah halaman.
Mike Devenney

Jawaban:

157

MVC sekarang membuat serial JSON dengan nama kasus unta secara default

Gunakan kode ini untuk menghindari nama kasus unta secara default

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

Sumber: https://github.com/aspnet/Announcements/issues/194

Oleksandr Fentsyk
sumber
8
netcore2: menggunakan Newtonsoft.Json.Serialization;
david.barkhuizen
3
Saya tidak ingin mengubah semua serialisasi JSON saya, hanya satu kasus tertentu yang harus sesuai dengan perilaku beberapa perangkat lunak pihak ketiga. Bagaimana seseorang memberikan pengaturan serialisasi yang benar di parameter kedua Json()panggilan?
Auspex
79

Jika Anda menemukan ini dari Google dan mencari solusi untuk Core 3.

Core 3 menggunakan System.Text.Json, yang secara default tidak menyimpan case. Seperti yang disebutkan dengan masalah GitHub ini , mengatur PropertyNamingPolicyke nol akan memperbaiki masalah.

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

dan jika Anda tidak ingin mengubah pengaturan global, untuk satu tindakan saja seperti ini:

return Json(obj, new JsonSerializerOptions { PropertyNamingPolicy = null });
Ron Rebennack
sumber
8
Anda adalah tuan dan penyelamat saya
Jonty Morris
1
Ini bekerja dengan baik untuk saya di Core 3.1. Saya tidak bisa mendapatkan komponen kendo saya untuk bekerja dengan baik dan menemukan json dalam format kotak unta. Ini menyelesaikan masalah.
Waragi
Saya juga subjek Anda
João Loureiro
9

Bagi mereka yang bermigrasi ke Core 3.1 dan memiliki proyek Core MVC dapat menggunakan kode pengaturan berikut di Startup.cs:


        public void ConfigureServices(IServiceCollection services)
        {
            ...
            services.AddControllersWithViews().AddJsonOptions(opts => opts.JsonSerializerOptions.PropertyNamingPolicy = null);
            ...
        }
UY
sumber
Ini sama dengan jawaban sebelumnya stackoverflow.com/a/58187836/125981
Mark Schultheiss
@MarkSchultheiss Anda mungkin benar, karena jawaban saya mirip dengan yang lain, namun, ketika saya mencari jawaban yang tepat berdasarkan jenis proyek saya, yaitu MVC yang memanfaatkan pandangan, saya tidak menemukan jawaban yang tepat yang cocok dengan proyek saya. AddControllersWithViews () menambahkan bagian yang hilang tersebut, dan saya pikir ini akan berguna bagi siapa pun di masa mendatang. Terima kasih atas komentar Anda!
UY
3

Ini akan memperbaikinya di dotnet core 3 webapi, sehingga tidak mengubah nama properti Anda sama sekali, dan Anda kembali ke klien persis seperti yang Anda inginkan.

Di Startup.cs:

public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers().AddJsonOptions(options => options.JsonSerializerOptions.PropertyNamingPolicy = null);
        services.AddHttpClient();
    }
RouterBox
sumber
Ini sama dengan jawaban sebelumnya stackoverflow.com/a/58187836/125981
Mark Schultheiss
1

Untuk beberapa orang yang menggunakan ASP.net WEB API (bukan ASP.NET Core).

Tambahkan baris ini di WebApiConfig Anda.

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

jsonFormatter.SerializerSettings.ContractResolver = new DefaultContractResolver();

Menambahkan ini sebagai jawaban di sini karena ini juga muncul pertama kali di pencarian google untuk api web.

Abdul Rehman Sayed
sumber
0

Untuk versi Core 2.x, menggunakan kode ini Anda dapat menghindari nama kasus unta secara default. Anda perlu menambahkan kode berikut di dalam metode ConfigureServices dari file Startup.cs.

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

        castedResolver.NamingStrategy = null;
    }
});
Asiri Jayaweera
sumber