使用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的链接在这里:

http://blogs.msdn.com/b/alexghi/archive/2008/12/22/using-anonymous-types-to-deserialize-json-data.aspx

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.