使用Json.net将json对象反序列化为动态对象

时间:2010-12-26 23:24:08

标签: c# .net json.net

是否可以使用json.net从json反序列化返回动态对象?我想做这样的事情:

dynamic jsonResponse = JsonConvert.Deserialize(json);
Console.WriteLine(jsonResponse.message);

8 个答案:

答案 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,则执行此操作。

enter image description here

答案 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序列化程序中构建的解决方案。链接到反序列化为匿名类型的地方是:

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

答案 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>);