Saya mencoba untuk membuat serial kelas POCO yang secara otomatis dihasilkan dari Entity Data Model .edmx dan ketika saya menggunakannya
JsonConvert.SerializeObject
Saya mendapat kesalahan berikut:
Terjadi kesalahan referensi otomatis terdeteksi untuk tipe System.data.entity.
Bagaimana saya mengatasi masalah ini?
json
serialization
json.net
NevenHuynh
sumber
sumber
async
pemanggilan metode (aTask
) dan lupa untuk mengawaliawait
pernyataan itu.Jawaban:
Itu adalah solusi terbaik https://code.msdn.microsoft.com/Loop-Reference-handling-in-caaffaf7
Perbaiki 1: Mengabaikan referensi melingkar secara global
(Saya telah memilih / mencoba yang ini, seperti yang lainnya)
Serializer json.net memiliki opsi untuk mengabaikan referensi melingkar. Masukkan kode berikut ke dalam
WebApiConfig.cs
file:Perbaikan sederhana akan membuat serializer mengabaikan referensi yang akan menyebabkan perulangan. Namun, ia memiliki keterbatasan:
Jika Anda ingin menggunakan perbaikan ini dalam proyek ASP.NET non-api, Anda dapat menambahkan baris di atas
Global.asax.cs
, tetapi pertama-tama tambahkan:Jika Anda ingin menggunakan ini dalam proyek .Net Core , Anda dapat mengubahnya
Startup.cs
sebagai:Fix 2: Mempertahankan referensi melingkar secara global
Perbaikan kedua ini mirip dengan yang pertama. Ubah saja kodenya menjadi:
Bentuk data akan diubah setelah menerapkan pengaturan ini.
$ Id dan $ ref menjaga semua referensi dan membuat tingkat objek grafik datar, tetapi kode klien perlu mengetahui perubahan bentuk untuk mengkonsumsi data dan itu hanya berlaku untuk JSON.NET serializer juga.
Perbaiki 3: Abaikan dan pertahankan atribut referensi
Perbaikan ini menghias atribut pada kelas model untuk mengontrol perilaku serialisasi pada model atau tingkat properti. Untuk mengabaikan properti:
JsonIgnore untuk JSON.NET dan IgnoreDataMember untuk XmlDCSerializer. Untuk menyimpan referensi:
JsonObject(IsReference = true)]
untuk JSON.NET dan[DataContract(IsReference = true)]
untuk XmlDCSerializer. Perhatikan bahwa: setelah mendaftarDataContract
di kelas, Anda perlu menambahkanDataMember
properti yang ingin Anda serialkan.Atribut dapat diterapkan pada serializer json dan xml dan memberikan lebih banyak kontrol pada kelas model.
sumber
[JsonIgnore]
atribut di atas bekerja untuk saya.Gunakan JsonSerializerSettings
ReferenceLoopHandling.Error
(default) akan salah jika loop referensi ditemukan. Inilah sebabnya mengapa Anda mendapatkan pengecualian.ReferenceLoopHandling.Serialize
berguna jika objek bersarang tetapi tidak tanpa batas.ReferenceLoopHandling.Ignore
tidak akan membuat cerita bersambung objek jika objek anak itu sendiri.Contoh:
Jika Anda harus membuat cerita bersambung dari suatu objek yang bersarang tanpa batas waktu Anda dapat menggunakan PreserveObjectReferences untuk menghindari StackOverflowException.
Contoh:
Pilih apa yang masuk akal untuk objek yang Anda serialkan.
Referensi http://james.newtonking.com/json/help/
sumber
ReferenceLoopHandling = ReferenceLoopHandling.Ignore
untuk bekerjaReferenceLoopHandling.Serialize
akan menyebabkan serializer masuk ke loop rekursif tak terbatas dan meluap tumpukan.Cara mengatasinya adalah dengan mengabaikan referensi loop dan tidak membuat serial mereka. Perilaku ini ditentukan dalam
JsonSerializerSettings
.Single
JsonConvert
dengan kelebihan:Pengaturan Global dengan kode di
Application_Start()
dalam Global.asax.cs:Referensi: https://github.com/JamesNK/Newtonsoft.Json/issues/78
sumber
Cara paling sederhana untuk melakukan ini adalah menginstal Json.NET dari nuget dan menambahkan
[JsonIgnore]
atribut ke properti virtual di kelas, misalnya:Meskipun hari ini, saya membuat model dengan hanya properti yang ingin saya lewati sehingga lebih ringan, tidak termasuk koleksi yang tidak diinginkan, dan saya tidak kehilangan perubahan ketika saya membangun kembali file yang dihasilkan ...
sumber
Di .NET Core 1.0, Anda dapat mengatur ini sebagai pengaturan global di file Startup.cs Anda:
sumber
Jika Anda menggunakan .NET Core 2.x, perbarui bagian ConfigureServices Anda di Startup.cs
https://docs.microsoft.com/en-us/ef/core/querying/related-data#related-data-and-serialization
Jika Anda menggunakan .NET Core 3.x tanpa MVC, itu akan menjadi:
Penanganan loop referensi ini hampir wajib jika Anda menggunakan Entity Framework dan pola desain basis data pertama.
sumber
services.AddMvc()
?Untuk membuat serial kami di NEWTONSOFTJSON ketika Anda memiliki masalah loop, dalam kasus saya, saya tidak perlu memodifikasi global.asax atau apiconfig. Saya hanya menggunakan JsonSerializesSettings mengabaikan penanganan Looping.
sumber
Newtonsoft.Json.JsonConvert.SerializeObject(objToSerialize, new Newtonsoft.Json.JsonSerializerSettings() {ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore});
Kita bisa menambahkan dua baris ini ke konstruktor kelas DbContext untuk menonaktifkan loop referensi diri
sumber
Anda dapat menerapkan atribut ke properti juga. Itu
[JsonProperty( ReferenceLoopHandling = ... )]
atribut baik cocok untuk ini.Sebagai contoh:
Semoga itu bisa membantu, Jaans
sumber
Untuk mengabaikan referensi loop dan tidak membuat serialisasi secara global di MVC 6 gunakan yang berikut ini di startup.cs:
sumber
Gunakan ini di
WebApiConfig.cs
kelas:sumber
Bagi saya, saya harus menempuh rute yang berbeda. Alih-alih mencoba untuk memperbaiki serializer JSON.Net saya harus pergi setelah Pemuatan Malas pada datacontext saya.
Saya baru saja menambahkan ini ke repositori dasar saya:
Objek "konteks" adalah parameter konstruktor yang saya gunakan dalam repositori basis saya karena saya menggunakan injeksi dependensi. Anda bisa mengubah properti ProxyCreationEnabled di mana pun Anda instantiate datacontext Anda.
http://techie-tid-bits.blogspot.com/2015/09/jsonnet-serializer-and-error-self.html
sumber
Saya memiliki pengecualian ini dan solusi kerja saya Mudah dan Sederhana,
Abaikan properti yang direferensikan dengan menambahkan atribut JsonIgnore ke dalamnya:
Setel ulang properti ketika Anda Deserialize:
menggunakan Newtonsoft.Json;
sumber
[JsonIgnore]
Tim:
Ini bekerja dengan ASP.NET Core; Tantangan di atas adalah bagaimana Anda 'mengatur pengaturan untuk diabaikan'. Tergantung pada bagaimana Anda mengatur aplikasi Anda, itu bisa sangat menantang. Inilah yang bekerja untuk saya.
Ini dapat ditempatkan di bagian ConfigureServices (Layanan IServiceCollection) publik Anda.
sumber
Orang-orang sudah berbicara tentang [JsonIgnore] yang ditambahkan ke properti virtual di kelas, misalnya:
Saya juga akan berbagi opsi lain, [JsonProperty (NullValueHandling = NullValueHandling.Ignore)] yang menghilangkan properti dari serialisasi hanya jika itu nol:
sumber
Untuk .NET Core 3.0, perbarui kelas Startup.cs seperti yang ditunjukkan di bawah ini.
Lihat: https://devblogs.microsoft.com/aspnet/asp-net-core-updates-in-net-core-3-0-preview-5/
sumber
Cukup letakkan
Configuration.ProxyCreationEnabled = false;
di dalam file konteks; ini akan menyelesaikan masalah.sumber
Masalah Saya Dipecahkan dengan Custom Config JsonSerializerSettings:
sumber
Pastikan juga untuk menggunakan wait and async dalam metode Anda. Anda bisa mendapatkan kesalahan ini jika objek Anda tidak serial dengan benar.
sumber
Saya menghadapi masalah yang sama dan saya mencoba menggunakan JsonSetting untuk mengabaikan kesalahan referensi-diri itu agak berhasil sampai saya mendapat kelas yang referensi diri sangat dalam dan proses dot-net saya tergantung pada nilai penulisan Json.
Masalahku
Anda dapat melihat masalah di kelas Pengguna yang dirujuk ke CompanyUser kelas yang merupakan referensi-sendiri.
Sekarang, saya memanggil Metode GetAll yang mencakup semua properti relasional.
Pada tahap ini proses DotNetCore saya tergantung pada Executing JsonResult, menulis nilai ... dan tidak pernah datang. Di Startup.cs saya, saya sudah mengatur JsonOption. Untuk beberapa alasan EFCore termasuk properti bersarang yang saya tidak minta Ef berikan.
perilaku yang diharapkan seharusnya seperti ini
kemudian
pada tahap ini saya seharusnya hanya mendapatkan "Perusahaan.Perusahaan Pengguna.Pertama ini (). User.DisplayName" dan seharusnya tidak memberi saya Company.Perusahaan Pengguna.Pertama (). Pengguna.Perusahaan Pengguna yang menyebabkan masalah referensi diri; Secara teknis seharusnya tidak memberi saya User.CompanyUsers sebagai CompanyUsers adalah properti navigasi. Tapi, EfCore menjadi sangat bersemangat dan memberi saya User.CompanyUsers .
Jadi, saya memutuskan untuk menulis metode ekstensi agar properti dikecualikan dari objek (sebenarnya tidak termasuk itu hanya menyetel properti ke nol). Tidak hanya itu juga akan bekerja pada properti array. di bawah ini adalah kode saya juga akan mengekspor paket nuget untuk pengguna lain (tidak yakin apakah ini bahkan membantu seseorang). Alasannya sederhana karena saya terlalu malas untuk menulis. Pilih (n => baru {n.p1, n.p2}); Saya hanya tidak ingin menulis pernyataan pilih untuk mengecualikan hanya 1 properti!
Ini bukan kode terbaik (saya akan memperbarui pada tahap tertentu) karena saya telah menulis dengan tergesa-gesa dan meskipun ini dapat membantu seseorang yang ingin mengecualikan (set null) di objek dengan array juga.
kelas ekstensi di atas akan memberi Anda kemampuan untuk menyetel properti menjadi nol untuk menghindari array genap referensi diri.
Pembuat Ekspresi
Penggunaan:
Kelas Model
Data Dummy
Kasus:
Kasus 1: Kecualikan hanya properti tanpa array apa pun
Kasus 2: Kecualikan properti dengan 1 larik
Kasus 3: Kecualikan properti dengan 2 array bersarang
Kasus 4: EF GetAll Query With Include
Anda mengetahui bahwa metode Explode () juga merupakan metode ekstensi hanya untuk pembuat ekspresi kami untuk mendapatkan properti dari properti array. Setiap kali ada properti array gunakan .Explode (). YourPropertyToExclude atau .Explode (). Property1.MyArrayProperty.Explode (). MyStupidProperty . Kode di atas membantu saya menghindari referensi-diri sedalam yang saya inginkan. Sekarang saya dapat menggunakan GetAll dan mengecualikan properti yang tidak saya inginkan!
Terima kasih telah membaca posting besar ini!
sumber
Untuk tidak mengulang ini bekerja untuk saya
ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
Saya sudah menyelesaikan semuanya di sini - serialisasi Entity Framework anak-anak dengan .Net Core 2 WebAPI https://gist.github.com/Kaidanov/f9ad0d79238494432f32b8407942c606
Akan menghargai komentar apa pun. mungkin seseorang bisa menggunakannya kapan-kapan.
sumber
Kode C #:
sumber
Saya menyukai solusi yang melakukannya
Application_Start()
seperti pada jawaban di siniRupanya saya tidak bisa mengakses objek json di JavaScript menggunakan konfigurasi dalam fungsi saya seperti pada jawaban DalSoft karena objek yang dikembalikan memiliki "\ n \ r" di seluruh (kunci, val) objek.
Pokoknya apa pun yang berhasil (karena pendekatan yang berbeda bekerja dalam skenario yang berbeda berdasarkan komentar dan pertanyaan yang diajukan) meskipun cara standar untuk melakukannya akan lebih baik dengan beberapa dokumentasi yang baik yang mendukung pendekatan tersebut.
sumber