关于c#:使用Json.net将json对象反序列化为动态对象

Deserialize json object into dynamic object using Json.net

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

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


最新的json.net版本允许这样做:

1
2
3
4
5
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);

输出:

1
2
3
 1000
 string
 6

这里的文档:linq to json with json.net


从JSON.NET 4.0版本1开始,有本机动态支持:

1
2
3
4
5
6
7
8
9
10
11
[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年11月12日)以处理意见:

这很好用。如果检查调试器中的类型,您将看到该值实际上是动态的。基础类型是JObject。如果您想要控制类型(比如指定ExpandoObject,那么就这样做。

enter image description here


如果您只是反序列化为动态的,那么您将得到一个jobject。您可以使用Expandoobject获得所需的内容。

1
2
var converter = new ExpandoObjectConverter();    
dynamic message = JsonConvert.DeserializeObject<ExpandoObject>(jsonString, converter);


我知道这是老文章,但jsonconvert实际上有不同的方法,所以

1
2
var product = new { Name ="", Price = 0 };
var jsonResponse = JsonConvert.DeserializeAnonymousType(json, product);


是的,您可以使用jsonConvert.DeserializeObject来完成。要做到这一点,只需简单地做到:

1
2
dynamic jsonResponse = JsonConvert.DeserializeObject(json);
Console.WriteLine(jsonResponse["message"]);


注意:在2010年我回答这个问题时,没有某种类型的反序列化方法,这允许您在不定义实际类的情况下反序列化,并允许使用匿名类进行反序列化。

您需要有某种类型来反序列化。你可以做一些事情:

1
2
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


如果您使用的是旧版本的json.net,而不是jobject。

这是从JSON生成动态对象的另一种简单方法:https://github.com/chsword/jdynamic

Nuget安装

1
PM> Install-Package JDynamic

支持使用字符串索引访问成员,如:

1
2
dynamic json = new JDynamic("{a:{a:1}}");
Assert.AreEqual(1, json["a"]["a"]);

测试用例

您可以使用以下实用程序:

直接获取值

1
2
3
dynamic json = new JDynamic("1");

//json.Value

2.获取json对象中的成员

1
2
3
4
5
6
7
8
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公司

1
2
3
4
5
6
7
8
9
10
11
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.

其他

1
2
3
dynamic json = new JDynamic("{a:{a:1} }");

//json.a.a is 1.


是的,这是可能的。我一直在这样做。

1
dynamic Obj = JsonConvert.DeserializeObject(<your json string>);

对于非本地类型来说,这有点棘手。假设在obj中有一个classa和classb对象。它们都转换为Jobject。你需要做的是:

1
2
ClassA ObjA = Obj.ObjA.ToObject<ClassA>();
ClassB ObjB = Obj.ObjB.ToObject<ClassB>();