是否可以使用json.net从json反序列化返回动态对象?我想做这样的事情:
dynamic jsonResponse = JsonConvert.Deserialize(json);
Console.WriteLine(jsonResponse.message);
答案 0 :(得分:501)
最新的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 to JSON with Json.NET
答案 1 :(得分:99)
从Json.NET 4.0 Release 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。
更新(2014年12月11日)以发表评论:
这完全没问题。如果您在调试器中检查类型,您将看到该值实际上是 dynamic 。 基础类型是JObject
。如果要控制类型(例如指定ExpandoObject
,则执行此操作。
答案 2 :(得分:52)
如果你只是反序列化为动态,你将得到一个JObject。您可以使用ExpandoObject获得所需的内容。
var converter = new ExpandoObjectConverter();
dynamic message = JsonConvert.DeserializeObject<ExpandoObject>(jsonString, converter);
答案 3 :(得分:37)
我知道这是旧帖子,但JsonConvert实际上有一个不同的方法,所以它将是
var product = new { Name = "", Price = 0 };
var jsonResponse = JsonConvert.DeserializeAnonymousType(json, product);
答案 4 :(得分:20)
是的,您可以使用JsonConvert.DeserializeObject来完成。要做到这一点,只需简单地做:
dynamic jsonResponse = JsonConvert.DeserializeObject(json);
Console.WriteLine(jsonResponse["message"]);
答案 5 :(得分:17)
注意:当我在2010年回答这个问题时,如果没有某种类型,就无法反序列化,这样就可以在不定义实际类并允许匿名的情况下反序列化用于进行反序列化的类。
您需要使用某种类型来反序列化。你可以做一些事情:
var product = new { Name = "", Price = 0 };
dynamic jsonResponse = JsonConvert.Deserialize(json, product.GetType());
我的回答是基于.NET 4.0在JSON序列化程序中构建的解决方案。链接到反序列化为匿名类型的地方是:
答案 6 :(得分:5)
如果你使用旧版本的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.
答案 7 :(得分:0)
是的,这是可能的。我一直这样做。
.closed
非本机类型有点棘手。假设你的Obj中有一个ClassA和ClassB对象。它们都转换为JObject。你需要做的是:
dynamic Obj = JsonConvert.DeserializeObject(<your json string>);