dynamic是C#里面的动态类型,可在未知类型的情况访问对应的属性,非常灵活和方便。
使用Json.Net可以把一个Json字符串转换成一个JObject对象,如果有已知强类型,如果有已知对应的强类型,可以直接转成对应的类型。但如果没有,要访问Json里面对应的数据的时候,就显得比较麻烦。我们可以借助DynamicObject来访问对应的属性。
DynamicObject
我们要创建一个动态类,用于访问JObject,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
public class JObjectAccessor : DynamicObject { JToken obj; public JObjectAccessor(JToken obj) { this .obj = obj; } public override bool TryGetMember(GetMemberBinder binder, out object result) { result = null ; if (obj == null ) return false ; var val = obj[binder.Name]; if (val == null ) return false ; result = Populate(val); return true ; } private object Populate(JToken token) { var jval = token as JValue; if (jval != null ) { return jval.Value; } else if (token.Type == JTokenType.Array) { var objectAccessors = new List< object >(); foreach (var item in token as JArray) { objectAccessors.Add(Populate(item)); } return objectAccessors; } else { return new JObjectAccessor(token); } } } |
接下来就可以开始使用它了:
1
2
3
4
5
6
7
8
|
string json = @"{'name': 'Jeremy Dorn','location': {'city': 'San Francisco','state': 'CA'},'pets': [{'type': 'dog','name': 'Walter'}]}" ; JObject jobj = JObject.Parse(json); dynamic obj = new JObjectAccessor(jobj); Console.WriteLine($ "{obj.name}: {obj.location.city} {obj.location.state}" ); Console.WriteLine($ "{obj.pets[0].type}: {obj.pets[0].name}" ); |
运行一下程序,看一下输出结果:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:http://www.zkea.net/codesnippet/detail/post-99.html