使用Json.net将json对象反序列化为dynamic对象
是否有可能使用json.net从json反序列化中返回一个dynamic对象? 我想要做这样的事情:
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
这里的文档: 使用Json.NET的LINQ to JSON
从Json.NET 4.0 Release 1开始,就有了本地的dynamic支持:
[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/2014)以解决评论:
这工作得很好。 如果你在debugging器中检查这个types,你会发现这个值实际上是dynamic的 。 基础types是一个JObject
。 如果你想控制types(如指定ExpandoObject
,那么这样做。
我知道这是旧的职位,但JsonConvert实际上有一个不同的方法,所以它会
var product = new { Name = "", Price = 0 }; var jsonResponse = JsonConvert.DeserializeAnonymousType(json, product);
如果你只是反序列化dynamic,你会得到一个JObject。 你可以通过使用ExpandoObject得到你想要的。
var converter = new ExpandoObjectConverter(); dynamic message = JsonConvert.DeserializeObject<ExpandoObject>(jsonString, converter);
注意:在2010年我回答这个问题的时候,如果没有某种types的types,就没有办法反序列化,这样可以反序列化,而不需要去定义实际的类,并且允许使用匿名类来进行反序列化。
你需要有一些types的反序列化。 你可以做一些事情:
var product = new { Name = "", Price = 0 }; dynamic jsonResponse = JsonConvert.Deserialize(json, product.GetType());
编辑:外延,没有必要编辑我的答案。 我的答案是基于.NET 4.0在JSON序列化器中构build的解决scheme。
编辑2:由于外延是无缘无故的哭了,反链接到匿名types的链接在这里:
Edit3:已经有6年了,尽pipe这个答案是有效的,人们仍然在低调回答这个问题。 如果你打算倒下,解释原因。
是的,你可以使用JsonConvert.DeserializeObject来做到这一点。 要做到这一点,只需简单地做:
dynamic jsonResponse = JsonConvert.DeserializeObject(json); Console.WriteLine(jsonResponse["message"]);
如果你使用JSON.NET与没有JObject的旧版本。
这是从JSON制作dynamic对象的另一种简单方法: https : //github.com/chsword/jdynamic
NuGet安装
PM> Install-Package JDynamic
支持使用string索引来访问成员,如:
dynamic json = new JDynamic("{a:{a:1}}"); Assert.AreEqual(1, json["a"]["a"]);
testing用例
你可以使用这个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.aa is 1.