Saya mencoba melakukan pengembalian JSON sederhana tetapi saya mengalami masalah saya memiliki yang berikut di bawah ini.
public JsonResult GetEventData()
{
var data = Event.Find(x => x.ID != 0);
return Json(data);
}
Saya mendapatkan HTTP 500 dengan pengecualian seperti yang ditunjukkan pada judul pertanyaan ini. Saya juga mencoba
var data = Event.All().ToList()
Itu memberi masalah yang sama.
Apakah ini bug atau implementasi saya?
ScriptIgnore
atribut. stackoverflow.com/questions/1193857/subsonic-3-0-0-2-structs-ttScriptIgnore
atribut pada properti Tournament.Game dan itu bekerja dengan baik :)Jawaban:
Tampaknya ada referensi melingkar dalam hierarki objek Anda yang tidak didukung oleh serializer JSON. Apakah Anda memerlukan semua kolom? Anda hanya dapat mengambil properti yang Anda butuhkan dalam tampilan:
Ini akan membuat objek JSON Anda lebih ringan dan lebih mudah dipahami. Jika Anda memiliki banyak properti, AutoMapper dapat digunakan untuk memetakan secara otomatis antara objek DTO dan objek Lihat.
sumber
Saya memiliki masalah yang sama dan diselesaikan oleh
using Newtonsoft.Json;
sumber
Ini sebenarnya terjadi karena objek kompleks adalah apa yang membuat objek json yang dihasilkan gagal. Dan itu gagal karena ketika objek dipetakan itu memetakan anak-anak, yang memetakan orang tua mereka, membuat referensi melingkar terjadi. Json akan mengambil waktu tak terbatas untuk membuat cerita bersambung, sehingga mencegah masalah dengan pengecualian.
Pemetaan Entity Framework juga menghasilkan perilaku yang sama, dan solusinya adalah membuang semua properti yang tidak diinginkan.
Hanya dengan menjelaskan jawaban akhir, seluruh kode akan menjadi:
Ini juga bisa menjadi yang berikut jika Anda tidak ingin objek di dalam
Result
properti:sumber
Singkatnya, ada 4 solusi untuk ini:
Solusi 1: matikan ProxyCreation untuk DBContext dan kembalikan pada akhirnya.
Solusi 2: Menggunakan JsonConvert dengan Mengatur ReferenceLoopHandling untuk mengabaikan pengaturan serializer.
Mengikuti dua solusi adalah sama, tetapi menggunakan model lebih baik karena diketik dengan kuat.
Solusi 3: kembalikan Model yang hanya mencakup properti yang diperlukan.
Solusi 4: kembalikan objek dinamis baru yang hanya mencakup properti yang diperlukan.
sumber
JSON, seperti xml dan berbagai format lainnya, adalah format serialisasi berbasis pohon. Itu tidak akan mencintaimu jika Anda memiliki referensi melingkar di objek Anda, seperti "pohon" akan:
Sering ada cara menonaktifkan navigasi di sepanjang jalur tertentu; misalnya, dengan
XmlSerializer
Anda menandai properti induk sebagaiXmlIgnore
. Saya tidak tahu apakah ini mungkin dengan serializer json yang dipermasalahkan, atau apakahDatabaseColumn
memiliki penanda yang cocok ( sangat tidak mungkin, karena perlu merujuk setiap API serialisasi)sumber
Ini karena templat DbContext T4 baru yang digunakan untuk menghasilkan entitas EntityFramework. Untuk dapat melakukan pelacakan perubahan, template ini menggunakan pola Proxy, dengan membungkus POCO Anda yang bagus dengannya. Ini kemudian menyebabkan masalah ketika membuat serial dengan JavaScriptSerializer.
Maka 2 solusi tersebut adalah:
Anda dapat mematikan generasi proksi otomatis dengan mengaturnya pada konfigurasi konteks
context.Configuration.ProxyCreationEnabled = false;
Sangat dijelaskan di artikel di bawah ini.
http://juristr.com/blog/2011/08/javascriptserializer-circular-reference/
sumber
Menggunakan Newtonsoft.Json: Di metode Global.asax Application_Start Anda tambahkan baris ini:
sumber
tambahkan
[JsonIgnore]
ke properti virtual dalam model Anda.sumber
Hindari mengonversi objek tabel secara langsung. Jika relasi diatur di antara tabel lain, itu mungkin membuang kesalahan ini. Sebaliknya, Anda bisa membuat kelas model, memberikan nilai ke objek kelas dan kemudian membuat cerita bersambung.
sumber
Jawaban yang diberikan bagus, tetapi saya pikir mereka dapat ditingkatkan dengan menambahkan perspektif "arsitektur".
Penyelidikan
MVC's Controller.Json
fungsi melakukan pekerjaan, tetapi sangat buruk dalam memberikan kesalahan yang relevan dalam kasus ini. Dengan menggunakanNewtonsoft.Json.JsonConvert.SerializeObject
, kesalahan menentukan dengan tepat apa properti yang memicu referensi melingkar. Ini sangat berguna ketika membuat serial hierarki objek yang lebih kompleks.Arsitektur yang tepat
Seseorang seharusnya tidak pernah mencoba membuat serial model data (misalnya model EF), karena properti navigasi ORM adalah jalan menuju kehancuran ketika datang ke serialisasi. Aliran data harus sebagai berikut:
Model layanan dapat diperoleh dari model data menggunakan pemetaan otomatis (misalnya Automapper ). Meskipun ini tidak menjamin kurangnya referensi melingkar, desain yang tepat harus melakukannya: model layanan harus berisi persis apa yang dibutuhkan oleh konsumen layanan (yaitu properti).
Dalam kasus yang jarang terjadi, ketika klien meminta hierarki yang melibatkan jenis objek yang sama pada tingkat yang berbeda, layanan dapat membuat struktur linier dengan hubungan orangtua - anak (menggunakan pengidentifikasi hanya, bukan referensi).
Aplikasi modern cenderung menghindari pemuatan struktur data yang kompleks sekaligus dan model layanan harus ramping. Misalnya:
sumber
Saya Menggunakan perbaikan, Karena Menggunakan Knockout dalam tampilan MVC5.
Beraksi
fungsi
sumber
Anda dapat melihat properti yang menyebabkan referensi melingkar. Maka Anda dapat melakukan sesuatu seperti:
sumber
sumber
Alternatif yang lebih mudah untuk menyelesaikan masalah ini adalah mengembalikan string, dan memformat string tersebut ke json dengan JavaScriptSerializer.
Penting bagian "Pilih", yang memilih properti yang Anda inginkan dalam tampilan Anda. Beberapa objek memiliki referensi untuk orang tua. Jika Anda tidak memilih atribut, referensi melingkar dapat muncul, jika Anda hanya mengambil tabel secara keseluruhan.
Jangan lakukan ini:
Lakukan ini sebagai gantinya jika Anda tidak ingin seluruh tabel:
Ini membantu membuat tampilan dengan data lebih sedikit, hanya dengan atribut yang Anda butuhkan, dan membuat web Anda berjalan lebih cepat.
sumber