Đây là khá yếu vì bạn phải chuyển đổi trở lại thành một chuỗi, nhưng nếu bạn đang làm một cái gì đó nhanh chóng và bẩn, nơi hit hiệu suất sẽ không thành vấn đề, tôi sử dụng phương pháp dưới đây. Tôi thích nó vì tôi không phải viết bất kỳ mã nào để ánh xạ các thuộc tính giữa json/JObject và POCO của tôi.
public static class JsonExtensions {
public static T As<T>(this JObject jobj) {
return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(jobj));
}
public static List<T> ToList<T>(this JArray jarray) {
return JsonConvert.DeserializeObject<List<T>>(JsonConvert.SerializeObject(jarray));
}
}
[Test]
public void TestDeserializeRootObject() {
var json = @"{ id: 1, name: ""Dwight"" }";
var jfoo = JsonConvert.DeserializeObject(json);
var foo = (jfoo as JObject).As<Foo>();
Assert.AreEqual(1, foo.Id);
Assert.AreEqual("Dwight", foo.Name);
}
[Test]
public void TestDeserializeArray() {
var json = @"[
{ id: 1, name: ""Dwight"" }
, { id: 2, name: ""Pam"" }
]";
var foosArr = JsonConvert.DeserializeObject(json);
Assert.IsInstanceOf<JArray>(foosArr);
Assert.AreEqual(2, (foosArr as JArray).Count);
var foos = (foosArr as JArray).ToList<Foo>();
Assert.AreEqual(2, foos.Count);
var foosDict = foos.ToDictionary(f => f.Name, f => f);
Assert.IsTrue(foosDict.ContainsKey("Dwight"));
var dwight = foosDict["Dwight"];
Assert.AreEqual(1, dwight.Id);
Assert.AreEqual("Dwight", dwight.Name);
Assert.IsTrue(foosDict.ContainsKey("Pam"));
var pam = foosDict["Pam"];
Assert.AreEqual(2, pam.Id);
Assert.AreEqual("Pam", pam.Name);
}
Nguồn
2013-03-15 19:34:10
Tôi thích phương pháp này. Nó ngắn gọn và thanh lịch hơn. – Mahmoodvcs
Tôi nghĩ tôi cũng thích câu trả lời này. Đôi khi tôi bỏ qua LINQ. – moswald
Cũng có thể tránh việc truyền: myJArray.Select (jv => jv.Value()). ToArray(); –
mikebridge