软件编程
位置:首页>> 软件编程>> C#编程>> C#使用dynamic类型访问JObject对象

C#使用dynamic类型访问JObject对象

作者:ZKEASOFT  发布时间:2022-03-01 13:05:28 

标签:C#,dynamic,JObject

dynamic是C#里面的动态类型,可在未知类型的情况访问对应的属性,非常灵活和方便。

使用Json.Net可以把一个Json字符串转换成一个JObject对象,如果有已知强类型,如果有已知对应的强类型,可以直接转成对应的类型。但如果没有,要访问Json里面对应的数据的时候,就显得比较麻烦。我们可以借助DynamicObject来访问对应的属性。

DynamicObject

我们要创建一个动态类,用于访问JObject,代码如下:


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);
   }
 }
}

接下来就可以开始使用它了:


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}");

运行一下程序,看一下输出结果:

C#使用dynamic类型访问JObject对象

来源:http://www.zkea.net/codesnippet/detail/post-99.html

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com