Saya memiliki daftar kunci / nilai sederhana di JSON yang dikirim kembali ke ASP.NET melalui POST. Contoh:
{ "key1": "value1", "key2": "value2"}
SAYA TIDAK BERCOBA UNTUK MENERBITKAN KE DALAM OBYEK .NET OBYEK
Saya hanya perlu Kamus tua sederhana (Dari String, String) , atau setara (tabel hash, Kamus (Of String, Object), old-school StringDictionary - hell, 2-D array string akan bekerja untuk saya.
Saya dapat menggunakan apa pun yang tersedia di ASP.NET 3.5, serta Json.NET yang populer (yang sudah saya gunakan untuk serialisasi ke klien).
Rupanya tak satu pun dari pustaka JSON ini yang memiliki kemampuan menampar dahi yang jelas di luar kotak - mereka benar-benar fokus pada deserialisasi berbasis refleksi melalui kontrak yang kuat.
Ada ide?
Keterbatasan:
- Saya tidak ingin mengimplementasikan parser JSON saya sendiri
- Belum dapat menggunakan ASP.NET 4.0
- Lebih suka tinggal jauh dari yang lebih tua, kelas ASP.NET usang untuk JSON
json
asp.net-ajax
asp.net-3.5
json.net
richardtallent
sumber
sumber
JavaScriptSerizlizer
digunakan dalam ASP.NET MVC dan tidak lagi ditinggalkan.Jawaban:
Json.NET melakukan ini ...
Lebih banyak contoh: Serializing Collections dengan Json.NET
sumber
dynamic
sebagai nilai untuk nilai-nilai:JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(json);
[{key: "a", value: "1"}, {key: "b", value:"2"}]
Anda harus melakukan sesuatu seperti ini:var dict = JsonConvert.DeserializeObject<List<KeyValuePair<string, string>>>(json);
Saya menemukan .NET memiliki cara untuk memasukkan string JSON ke dalam
Dictionary<String, Object>
melaluiSystem.Web.Script.Serialization.JavaScriptSerializer
tipe dalamSystem.Web.Extensions
perakitan 3,5 . Gunakan metodenyaDeserializeObject(String)
.Saya menemukan ini ketika melakukan posting ajax (via jquery) dari tipe konten 'application / json' ke .net Page Metode statis dan melihat bahwa metode (yang memiliki parameter tipe tunggal
Object
) secara ajaib menerima Kamus ini.sumber
var jsSerializer = new System.Web.Script.Serialization.JavaScriptSerializer();
diikuti olehDictionary<string, object> dict = (Dictionary<string, object>)jsSerializer.DeserializeObject(jsonString);
SomeData: ""
Bagi mereka yang mencari di internet dan menemukan posting ini, saya menulis posting blog tentang cara menggunakan kelas JavaScriptSerializer.
Baca selengkapnya ... http://procbits.com/2011/04/21/quick-json-serializationdeserialization-in-c/
Berikut ini sebuah contoh:
sumber
Mencoba untuk tidak menggunakan implementasi JSON eksternal jadi saya deserialised seperti ini:
sumber
System.Web.Script.Serialization
. Itu hanya bekerja. Saya bahkan dapat menggunakan JSON "tidak valid"string json = "{'id':13, 'value': true}";
.Saya memiliki masalah yang sama, jadi saya menulis ini sendiri. Solusi ini dibedakan dari jawaban lain karena dapat deserialize ke beberapa level.
Cukup kirim string JSON ke fungsi deserializeToDictionary itu akan mengembalikan objek yang tidak diketik dengan kuat
Dictionary<string, object>
.Kode lama
Mis: Ini akan mengembalikan
Dictionary<string, object>
objek respons JSON Facebook.Uji
Memperbarui
Jawaban lama saya berfungsi dengan baik jika tidak ada larik pada string JSON. Ini lebih lanjut deserialize ke
List<object>
jika elemen adalah array.Cukup kirim string JSON ke fungsi deserializeToDictionaryOrList, ia akan mengembalikan objek yang tidak diketik dengan kuat
Dictionary<string, object>
atauList<object>
.sumber
is
danas
operator sangat membantu saya dan menyederhanakan kode saya sendiri.Jika Anda mencari jenis pendekatan yang ringan, tanpa tambahan referensi, mungkin sedikit kode yang baru saja saya tulis ini akan berfungsi (saya tidak bisa menjamin 100% kekokohan).
[Saya sadar ini melanggar OP Limitation # 1, tetapi secara teknis, Anda tidak menulisnya, saya melakukannya]
sumber
System.RunTime.Serialization
bukan salah satunya, sayangnya JSON.NET tergantung pada dan karenanya tidak bisa digunakan juga. Terima kasih dexy untuk pekerjaan Anda yang sangat baik, saya berani sedikit memperbaikinya untuk dapat membatalkan deserisasi array array, lihat kode yang diperbarui dalam jawaban saya di sini .Saya hanya perlu menguraikan kamus bersarang , seperti
di mana
JsonConvert.DeserializeObject
tidak membantu. Saya menemukan pendekatan berikut:The
SelectToken
memungkinkan Anda menggali ke bawah ke kolom yang diinginkan. Anda bahkan dapat menentukan jalur yang ingin"x.y.z"
melangkah lebih jauh ke objek JSON.sumber
System.Text.Json
Ini sekarang dapat dilakukan dengan menggunakan
System.Text.Json
bawaan untuk.net core 3.0
. Sekarang dimungkinkan untuk men-deserialisasi JSON tanpa menggunakan perpustakaan pihak ketiga.Juga tersedia di System.Text.Json paket nu-get jika menggunakan .Net Standard atau .Net Framework.
sumber
System.Text.Json
adalah cara untuk pergi hari ini.Mark Rendle memposting ini sebagai komentar , saya ingin mempostingnya sebagai jawaban karena itu satu-satunya solusi yang telah bekerja sejauh ini untuk mengembalikan keberhasilan dan kode kesalahan hasil json dari respons Google reCaptcha.
Sekali lagi terima kasih, Mark!
sumber
Sunting: Ini berfungsi, tetapi jawaban yang diterima menggunakan Json.NET jauh lebih mudah. Meninggalkan yang satu ini seandainya seseorang membutuhkan kode BCL-only.
Itu tidak didukung oleh .NET framework of the box. Pengawasan yang mencolok - tidak semua orang perlu melakukan deserialisasi menjadi objek dengan properti bernama. Jadi saya akhirnya menggulung sendiri:
Disebut dengan:
Maaf untuk campuran C # dan VB.NET ...
sumber
Saya telah menambahkan kode yang dikirimkan oleh jSnake04 dan Dasun di sini. Saya telah menambahkan kode untuk membuat daftar objek dari
JArray
instance. Ini memiliki rekursi dua arah tetapi karena berfungsi pada model pohon tetap, terbatas, tidak ada risiko stack overflow kecuali datanya masif.sumber
Saya menambahkan cek untuk nilai nol di JSON ke jawaban lainnya
Saya memiliki masalah yang sama jadi saya menulis ini sendiri. Solusi ini dibedakan dari jawaban lain karena dapat deserialize ke beberapa level.
Cukup kirim string json ke fungsi deserializeToDictionary itu akan mengembalikan objek yang tidak diketik dengan kuat
Dictionary<string, object>
.Mis: Ini akan mengembalikan
Dictionary<string, object>
objek respons JSON Facebook.Catatan: kota kelahiran lebih lanjut deserialize menjadi
Dictionary<string, object>
objek.sumber
d.Value is JObject
. Anda tidak harus melalui refleksi untuk memeriksa jenis. Dan denganis
operator Anda tidak perlu memeriksa nol. Mengembalikan nilai false jika objek adalah null.Tampaknya semua jawaban ini di sini hanya berasumsi bahwa Anda dapat memperoleh string kecil dari objek yang lebih besar ... bagi orang-orang yang ingin secara sederhana mendesentralisasi objek besar dengan kamus semacam itu di suatu tempat di dalam pemetaan, dan yang menggunakan
System.Runtime.Serialization.Json
sistem DataContract, inilah sebuah solusi:Jawaban di gis.stackexchange.com memiliki tautan menarik ini . Saya harus memulihkannya dengan archive.org, tetapi ia menawarkan solusi yang cukup sempurna:
IDataContractSurrogate
kelas khusus di mana Anda menerapkan persis tipe Anda sendiri. Saya bisa mengembangkannya dengan mudah.Saya membuat banyak perubahan di dalamnya. Karena sumber asli tidak lagi tersedia, saya akan memposting seluruh kelas di sini:
Untuk menambahkan tipe baru yang didukung ke kelas, Anda hanya perlu menambahkan kelas Anda, berikan konstruktor dan fungsi yang tepat (lihat
SurrogateDictionary
contohnya), pastikan mewarisiJsonSurrogateObject
, dan tambahkan pemetaan tipenya keKnownTypes
kamus. SurrogateDictionary yang disertakan dapat berfungsi sebagai dasar untuk semuaDictionary<String,T>
jenis di mana T adalah jenis apa pun yang melakukan deserialisasi dengan benar.Menyebutnya sangat sederhana:
Perhatikan bahwa karena alasan tertentu hal ini mengalami masalah menggunakan string kunci yang berisi spasi; mereka sama sekali tidak ada dalam daftar akhir. Mungkin saja itu hanya melawan spesifikasi json dan api yang saya panggil diimplementasikan dengan buruk, ingatlah; Saya tidak tahu. Bagaimanapun, saya memecahkan masalah ini dengan mengganti-ganti mereka dengan garis bawah pada data mentah json dan memperbaiki kamus setelah deserialisasi.
sumber
Dictionary<String,String>
. Sejujurnya saya tidak pernah mencoba deserialisasi jenis kompleks dengan sistem ini.Berdasarkan komentar di atas coba
JsonConvert.DeserializeObject<Dictionary<string,dynamic>>(json)
tampaknya berfungsi bahkan untuk objek dan daftar yang kompleks.
sumber
Saya baru saja mengimplementasikan ini di RestSharp . Posting ini sangat membantu saya.
Selain kode di tautan, ini adalah kode saya. Saya sekarang mendapatkan
Dictionary
hasil ketika saya melakukan sesuatu seperti ini:Perhatikan jenis JSON yang Anda harapkan - dalam kasus saya, saya mengambil satu objek dengan beberapa properti. Di tautan terlampir, penulis sedang mengambil daftar.
sumber
Pendekatan saya secara langsung deserializes ke IDictionary, tanpa JObject atau ExpandObject di antaranya. Kode ini menggunakan konverter, yang pada dasarnya disalin dari kelas ExpandoObjectConverter yang ditemukan di kode sumber JSON.NET, tetapi menggunakan IDictionary alih-alih ExpandoObject.
Pemakaian:
Kode:
sumber
Anda bisa menggunakan Tiny-JSON
sumber
Sedikit terlambat ke permainan, tetapi tidak ada solusi di atas menunjuk saya ke arah. NET murni dan sederhana, tidak ada solusi json.net. Jadi ini dia, akhirnya menjadi sangat sederhana. Di bawah ini adalah contoh lengkap bagaimana hal ini dilakukan dengan serialisasi .NET Json standar, contoh ini memiliki kamus baik dalam objek root dan objek anak.
Peluru emas adalah kucing ini, parsing pengaturan sebagai parameter kedua ke serializer:
Kode lengkap di bawah ini:
sumber
Cukup mengherankan, jika Anda ingin menggunakan pengikat model default, sepertinya Anda harus menggunakan nilai indeks numerik seperti formulir POST.
Lihat kutipan berikut dari artikel ini http://msdn.microsoft.com/en-us/magazine/hh781022.aspx :
sumber
Saya akan menyarankan menggunakan
System.Runtime.Serialization.Json
itu adalah bagian dari .NET 4.5.Kemudian gunakan seperti ini:
sumber
Bagi siapa saja yang mencoba mengonversi JSON ke kamus hanya untuk mengambil beberapa nilai darinya. ada cara sederhana menggunakan
Newtongsoft.JSON
sumber