dynamic json = new JDynamic("{a:{a:1}}");
Assert.AreEqual(1, json["a"]["a"]);
测试用例
您可以使用此util如下:
直接获取 Value
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.
8 回答
最新的json.net版本允许这样做:
输出:
文档: LINQ to JSON with Json.NET
从Json.NET 4.0 Release 1开始,有本机动态支持:
当然,获得当前版本的最佳方式是通过NuGet .
Updated (11/12/2014) to address comments:
这完全没问题 . 如果在调试器中检查类型,您将看到该值实际上是动态的 . 基础类型是
JObject
. 如果要控制类型(如指定ExpandoObject
,则执行此操作 .如果你只是反序列化为动态,你将得到一个JObject . 您可以使用ExpandoObject获得所需内容 .
我知道这是旧帖子,但JsonConvert实际上有一个不同的方法,所以它会
是的,你可以使用JsonConvert.DeserializeObject来做到这一点 . 要做到这一点,只需简单做:
Note: 当我在2010年回答这个问题时,如果没有某种类型,就无法反序列化,这允许你反序列化而不必定义实际的类并允许使用匿名类来进行反序列化 .
你需要有某种类型来反序列化 . 你可以做一些事情:
我的回答是基于.NET 4.0在JSON序列化器中构建的解决方案 . 链接到反序列化为匿名类型在这里:
http://blogs.msdn.com/b/alexghi/archive/2008/12/22/using-anonymous-types-to-deserialize-json-data.aspx
如果您使用JSON.NET与旧版本没有JObject .
这是从JSON生成动态对象的另一种简单方法:https://github.com/chsword/jdynamic
NuGet安装
支持使用字符串索引访问成员,如:
测试用例
您可以使用此util如下:
直接获取 Value
2.获取json对象中的成员
3.IEnumerable
其他
对的,这是可能的 . 我一直这样做 .
对于非本机类型,它有点棘手 . 假设你的Obj中有一个ClassA和ClassB对象 . 它们都转换为JObject . 你需要做的是: