เป็นไปได้หรือไม่ที่จะส่งคืนออบเจ็กต์แบบไดนามิกจากการดีซีเรียลไลซ์เจสันด้วย json.net ฉันต้องการทำสิ่งนี้:
dynamic jsonResponse = JsonConvert.Deserialize(json);
Console.WriteLine(jsonResponse.message);
เป็นไปได้หรือไม่ที่จะส่งคืนออบเจ็กต์แบบไดนามิกจากการดีซีเรียลไลซ์เจสันด้วย json.net ฉันต้องการทำสิ่งนี้:
dynamic jsonResponse = JsonConvert.Deserialize(json);
Console.WriteLine(jsonResponse.message);
คำตอบ:
Json.NET ช่วยให้เราสามารถทำสิ่งนี้:
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);
เอาท์พุท:
1000
string
6
เอกสารที่นี่: LINQ ถึง JSON ด้วย Json.NET
ดูเพิ่มเติมJObject.ParseและJArray.Parse
JArray.Parse
โปรดทราบว่าสำหรับอาร์เรย์ไวยากรณ์คือ
Dim d As Object = JObject.Parse("{number:1000, str:'string', array: [1,2,3,4,5,6]}")
ตั้งแต่ Json.NET 4.0 รีลีส 1 มีการรองรับแบบไดนามิกเนทีฟ:
[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>());
}
และแน่นอนว่าวิธีที่ดีที่สุดในการรับเวอร์ชันปัจจุบันคือผ่าน NuGet
อัปเดตเมื่อวันที่ 11/12/2557 เพื่อแสดงความคิดเห็น:
มันใช้งานได้ดีอย่างสมบูรณ์แบบ หากคุณตรวจสอบชนิดในการดีบักที่คุณจะเห็นว่ามีค่าเป็นในความเป็นจริงแบบไดนามิก ประเภทพื้นฐานJObject
เป็น หากคุณต้องการควบคุมประเภท (เช่นการระบุExpandoObject
ให้ทำเช่นนั้น
@Model.Prop
ชื่อในมีดโกนได้หากประเภทส่งคืนคือ JValue
JValue
แต่คุณสมบัติแบบไดนามิกแต่ละคนเป็น สิ่งที่ทำให้ฉันสับสนเพราะฉันทำงานในหน้าต่างดีบั๊กเกอร์ / ทันทีและไม่เห็นเพียงstring
s เดวิดแสดงภาพหน้าจอด้านล่าง JValue
เป็นแปลงสภาพดังนั้นคุณก็สามารถทำstring m = jsonResponse.message
หากคุณเพียง แต่ลังเลที่จะเปลี่ยนคุณจะได้รับ JObject กลับมา คุณสามารถได้รับสิ่งที่คุณต้องการโดยใช้ ExpandoObject
var converter = new ExpandoObjectConverter();
dynamic message = JsonConvert.DeserializeObject<ExpandoObject>(jsonString, converter);
ฉันรู้ว่านี่เป็นโพสต์เก่า แต่จริงๆแล้ว JsonConvert มีวิธีการที่แตกต่างกันดังนั้นมันจะเป็น
var product = new { Name = "", Price = 0 };
var jsonResponse = JsonConvert.DeserializeAnonymousType(json, product);
ใช่คุณสามารถทำได้โดยใช้ JsonConvert.DeserializeObject ในการทำเช่นนั้นทำได้ง่ายๆเพียง:
dynamic jsonResponse = JsonConvert.DeserializeObject(json);
Console.WriteLine(jsonResponse["message"]);
JsonConvert
Deserialize
ไม่ได้มีวิธีการที่เรียกว่า
หมายเหตุ:ในเวลาที่ฉันตอบคำถามนี้ในปี 2010 ไม่มีวิธีใดที่จะทำการดีซีเรียลไลซ์โดยไม่มีประเภทใด ๆ สิ่งนี้ทำให้คุณสามารถ deserialize โดยไม่ต้องไปกำหนดคลาสจริงและอนุญาตให้คลาสที่ไม่ระบุชื่อทำการ deserialization
คุณต้องมีประเภทของประเภทที่จะทำการยกเลิก คุณสามารถทำบางสิ่งตามแนวของ:
var product = new { Name = "", Price = 0 };
dynamic jsonResponse = JsonConvert.Deserialize(json, product.GetType());
คำตอบของฉันขึ้นอยู่กับโซลูชันสำหรับการสร้างของ. NET 4.0 ใน JSON serializer ลิงก์ไปยัง deserialize เป็นประเภทที่ไม่ระบุตัวตนอยู่ที่นี่:
หากคุณใช้ JSON.NET กับเวอร์ชันเก่าซึ่งไม่ได้เป็น JObject
นี่เป็นอีกวิธีง่ายๆในการสร้างวัตถุแบบไดนามิกจาก JSON: https://github.com/chsword/jdynamic
NuGet ติดตั้ง
PM> Install-Package JDynamic
สนับสนุนการใช้ดัชนีสตริงเพื่อเข้าถึงสมาชิกเช่น:
dynamic json = new JDynamic("{a:{a:1}}");
Assert.AreEqual(1, json["a"]["a"]);
กรณีทดสอบ
และคุณสามารถใช้ util นี้ดังต่อไปนี้:
รับค่าโดยตรง
dynamic json = new JDynamic("1");
//json.Value
2. รับสมาชิกในวัตถุ 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.IEnumerable
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.
อื่น ๆ
dynamic json = new JDynamic("{a:{a:1} }");
//json.a.a is 1.
ใช่มันเป็นไปได้ ฉันทำมาตลอด
dynamic Obj = JsonConvert.DeserializeObject(<your json string>);
มันค่อนข้างยากสำหรับคนที่ไม่ใช่เจ้าของภาษา สมมติว่าภายใน Obj ของคุณมีวัตถุ ClassA และ ClassB พวกเขาทั้งหมดถูกแปลงเป็น JObject สิ่งที่คุณต้องทำคือ:
ClassA ObjA = Obj.ObjA.ToObject<ClassA>();
ClassB ObjB = Obj.ObjB.ToObject<ClassB>();