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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 使用dynamic类型来访问JObject对象相关的知识,希望对你有一定的参考价值。

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

 

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

技术分享图片

原文地址:http://www.zkea.net/codesnippet/detail/post-99.html

以上是关于C# 使用dynamic类型来访问JObject对象的主要内容,如果未能解决你的问题,请参考以下文章

c# 读取json的问题,JObject不能强转成JArray

C#用dynamic一行代码实现反射操作

无法在 c# 中访问 jObject 令牌

C#的dynamic使用中有啥需要注意的地方,以免滥用

C# 可以修改MVC匿名类型的访问修饰符吗

JSON在JObject返回类型中返回空数组