Có thể trả về một đối tượng động từ quá trình khử tuần hoàn json bằng json.net không? Tôi muốn làm một cái gì đó như thế này:
dynamic jsonResponse = JsonConvert.Deserialize(json);
Console.WriteLine(jsonResponse.message);
Có thể trả về một đối tượng động từ quá trình khử tuần hoàn json bằng json.net không? Tôi muốn làm một cái gì đó như thế này:
dynamic jsonResponse = JsonConvert.Deserialize(json);
Console.WriteLine(jsonResponse.message);
Câu trả lời:
Json.NET cho phép chúng tôi làm điều này:
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);
Đầu ra:
1000
string
6
Tài liệu ở đây: LINQ to JSON với Json.NET
Xem thêm JObject.Pude và JArray.Pude
JArray.Parse
.
Dim d As Object = JObject.Parse("{number:1000, str:'string', array: [1,2,3,4,5,6]}")
Kể từ phiên bản 1 của Json.NET 4.0, có hỗ trợ động riêng:
[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>());
}
Và, tất nhiên, cách tốt nhất để có được phiên bản hiện tại là thông qua NuGet.
Cập nhật (11/12/2014) để giải quyết ý kiến:
Điều này hoạt động hoàn toàn tốt. Nếu bạn kiểm tra loại trong trình gỡ lỗi, bạn sẽ thấy rằng giá trị thực tế là động . Các loại cơ bản là một JObject
. Nếu bạn muốn kiểm soát loại (như chỉ định ExpandoObject
, thì hãy làm như vậy.
@Model.Prop
tên trong Dao cạo nếu loại trả về là JValue.
JValue
. Điều này làm tôi bối rối vì tôi đang làm việc trong trình gỡ lỗi / cửa sổ ngay lập tức và không thấy chỉ là string
s. David cho thấy điều này trong ảnh chụp màn hình dưới cùng. Có thể JValue
chuyển đổi để bạn có thể thực hiệnstring m = jsonResponse.message
Nếu bạn chỉ khử lưu động thành năng động, bạn sẽ nhận lại được JObject. Bạn có thể nhận được những gì bạn muốn bằng cách sử dụng ExpandoObject.
var converter = new ExpandoObjectConverter();
dynamic message = JsonConvert.DeserializeObject<ExpandoObject>(jsonString, converter);
Tôi biết đây là bài viết cũ nhưng JsonConvert thực sự có một phương pháp khác vì vậy nó sẽ là
var product = new { Name = "", Price = 0 };
var jsonResponse = JsonConvert.DeserializeAnonymousType(json, product);
Có, bạn có thể làm điều đó bằng cách sử dụng JsonConvert.DeserializeObject. Để làm điều đó, chỉ cần làm đơn giản:
dynamic jsonResponse = JsonConvert.DeserializeObject(json);
Console.WriteLine(jsonResponse["message"]);
JsonConvert
không chứa một phương thức gọi là Deserialize
.
Lưu ý: Tại thời điểm tôi trả lời câu hỏi này vào năm 2010, không có cách nào để giải tuần tự hóa mà không có loại nào, điều này cho phép bạn giải tuần tự hóa mà không cần phải xác định lớp thực tế và cho phép một lớp ẩn danh được sử dụng để thực hiện khử lưu huỳnh.
Bạn cần phải có một số loại để khử lưu huỳnh. Bạn có thể làm một cái gì đó dọc theo dòng:
var product = new { Name = "", Price = 0 };
dynamic jsonResponse = JsonConvert.Deserialize(json, product.GetType());
Câu trả lời của tôi dựa trên một giải pháp cho bản dựng tuần tự JSON của .NET 4.0. Liên kết để khử lưu lượng đến các loại ẩn danh ở đây:
http://bloss.msdn.com/b/alexghi/archive/2008/12/22/USE-anonymous-types-to-deserialize-json-data.aspx
Nếu bạn sử dụng JSON.NET với phiên bản cũ không JObject.
Đây là một cách đơn giản khác để tạo một đối tượng động từ JSON: https://github.com/chsword/jdynamic
Cài đặt NuGet
PM> Install-Package JDynamic
Hỗ trợ sử dụng chỉ mục chuỗi để truy cập thành viên như:
dynamic json = new JDynamic("{a:{a:1}}");
Assert.AreEqual(1, json["a"]["a"]);
Trường hợp thử nghiệm
Và bạn có thể sử dụng tiện ích này như sau:
Nhận giá trị trực tiếp
dynamic json = new JDynamic("1");
//json.Value
2.Nhận thành viên trong đối tượng 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. vô số
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.
Khác
dynamic json = new JDynamic("{a:{a:1} }");
//json.a.a is 1.
Vâng, nó là có thể. Tôi đã làm điều đó trong suốt thời gian đó.
dynamic Obj = JsonConvert.DeserializeObject(<your json string>);
Nó là một chút phức tạp hơn cho loại không bản địa. Giả sử bên trong Obj của bạn, có các đối tượng ClassA và ClassB. Tất cả đều được chuyển đổi thành JObject. Những gì bạn cần làm là:
ClassA ObjA = Obj.ObjA.ToObject<ClassA>();
ClassB ObjB = Obj.ObjB.ToObject<ClassB>();