Apakah mungkin untuk mengembalikan objek dinamis dari deserialisasi json menggunakan json.net? Saya ingin melakukan sesuatu seperti ini:
dynamic jsonResponse = JsonConvert.Deserialize(json);
Console.WriteLine(jsonResponse.message);
Apakah mungkin untuk mengembalikan objek dinamis dari deserialisasi json menggunakan json.net? Saya ingin melakukan sesuatu seperti ini:
dynamic jsonResponse = JsonConvert.Deserialize(json);
Console.WriteLine(jsonResponse.message);
Jawaban:
Json.NET memungkinkan kita melakukan ini:
dynamic d = JObject.Parse("{number:1000, str:'string', array: [1,2,3,4,5,6]}");
Console.WriteLine(d.number);
Console.WriteLine(d.str);
Console.WriteLine(d.array.Count);
Keluaran:
1000
string
6
Dokumentasi di sini: LINQ ke JSON dengan Json.NET
Lihat juga JObject.Parse dan JArray.Parse
JArray.Parse
.
Dim d As Object = JObject.Parse("{number:1000, str:'string', array: [1,2,3,4,5,6]}")
Pada Json.NET 4.0 Release 1, ada dukungan dinamis asli:
[Test]
public void DynamicDeserialization()
{
dynamic jsonResponse = JsonConvert.DeserializeObject("{\"message\":\"Hi\"}");
jsonResponse.Works = true;
Console.WriteLine(jsonResponse.message); // Hi
Console.WriteLine(jsonResponse.Works); // True
Console.WriteLine(JsonConvert.SerializeObject(jsonResponse)); // {"message":"Hi","Works":true}
Assert.That(jsonResponse, Is.InstanceOf<dynamic>());
Assert.That(jsonResponse, Is.TypeOf<JObject>());
}
Dan, tentu saja, cara terbaik untuk mendapatkan versi saat ini adalah melalui NuGet.
Diperbarui (11/12/2014) untuk menjawab komentar:
Ini berfungsi dengan baik. Jika Anda memeriksa jenis di debugger Anda akan melihat bahwa nilainya sebenarnya dinamis . The tipe yang mendasari adalah JObject
. Jika Anda ingin mengontrol tipe (seperti menentukan ExpandoObject
, maka lakukanlah.
@Model.Prop
nama dalam Razor jika tipe pengembaliannya adalah JValue.
JValue
. Yang membingungkan saya karena saya bekerja di debugger / jendela langsung dan tidak melihat hanya string
s. David menunjukkan ini di tangkapan layar bawah. Ini JValue
dapat dikonversi sehingga Anda bisa melakukannyastring m = jsonResponse.message
Jika Anda baru saja berhenti mendaftar untuk dinamis, Anda akan mendapatkan JObject kembali. Anda bisa mendapatkan apa yang Anda inginkan dengan menggunakan ExpandoObject.
var converter = new ExpandoObjectConverter();
dynamic message = JsonConvert.DeserializeObject<ExpandoObject>(jsonString, converter);
Saya tahu ini adalah postingan lama tetapi JsonConvert sebenarnya memiliki metode yang berbeda
var product = new { Name = "", Price = 0 };
var jsonResponse = JsonConvert.DeserializeAnonymousType(json, product);
Ya, Anda bisa melakukannya menggunakan JsonConvert.DeserializeObject. Untuk melakukan itu, cukup sederhana lakukan:
dynamic jsonResponse = JsonConvert.DeserializeObject(json);
Console.WriteLine(jsonResponse["message"]);
JsonConvert
tidak mengandung metode yang disebut Deserialize
.
Catatan: Pada saat saya menjawab pertanyaan ini pada tahun 2010, tidak ada cara untuk deserialize tanpa semacam jenis, ini memungkinkan Anda untuk deserialize tanpa harus mendefinisikan kelas yang sebenarnya dan memungkinkan kelas anonim digunakan untuk melakukan deserialisasi.
Anda harus memiliki semacam tipe deserialize. Anda dapat melakukan sesuatu seperti:
var product = new { Name = "", Price = 0 };
dynamic jsonResponse = JsonConvert.Deserialize(json, product.GetType());
Jawaban saya didasarkan pada solusi .NET 4.0 membangun JSizer serializer. Tautan ke deserialize ke jenis anonim ada di sini:
Jika Anda menggunakan JSON.NET dengan versi lama yang tidak JObject.
Ini adalah cara sederhana lain untuk membuat objek dinamis dari JSON: https://github.com/chsword/jdynamic
NuGet Instal
PM> Install-Package JDynamic
Dukungan menggunakan indeks string untuk mengakses anggota seperti:
dynamic json = new JDynamic("{a:{a:1}}");
Assert.AreEqual(1, json["a"]["a"]);
Kasus cobaan
Dan Anda dapat menggunakan util ini sebagai berikut:
Dapatkan nilainya secara langsung
dynamic json = new JDynamic("1");
//json.Value
2. Dapatkan anggota di objek json
dynamic json = new JDynamic("{a:'abc'}");
//json.a is a string "abc"
dynamic json = new JDynamic("{a:3.1416}");
//json.a is 3.1416m
dynamic json = new JDynamic("{a:1}");
//json.a is integer: 1
3. dapat dihitung
dynamic json = new JDynamic("[1,2,3]");
/json.Length/json.Count is 3
//And you can use json[0]/ json[2] to get the elements
dynamic json = new JDynamic("{a:[1,2,3]}");
//json.a.Length /json.a.Count is 3.
//And you can use json.a[0]/ json.a[2] to get the elements
dynamic json = new JDynamic("[{b:1},{c:1}]");
//json.Length/json.Count is 2.
//And you can use the json[0].b/json[1].c to get the num.
Lain
dynamic json = new JDynamic("{a:{a:1} }");
//json.a.a is 1.
Ya itu mungkin. Saya telah melakukan itu selama ini.
dynamic Obj = JsonConvert.DeserializeObject(<your json string>);
Ini agak sulit untuk tipe non asli. Misalkan di dalam Obj Anda, ada objek ClassA, dan ClassB. Mereka semua dikonversi ke JObject. Yang perlu Anda lakukan adalah:
ClassA ObjA = Obj.ObjA.ToObject<ClassA>();
ClassB ObjB = Obj.ObjB.ToObject<ClassB>();