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

原文地址:https://www.cnblogs.com/lonelyxmas/p/8863969.html

时间: 2024-08-25 05:13:24

C# 使用dynamic类型来访问JObject对象的相关文章

dynamic 类型不能访问属性

x //解决方案ProjectTest.项目A里面public object r(){ return new {id = 1,name = "zf"}; } //解决方案ProjectTest.项目B里面 public void GetR(){ var aObj = 项目A.r(); //报错:dynamic明明看到了字段,访问出错Microsoft.CSharp.RuntimeBinder.RuntimeBinderException   var id = aObj.id; } 去M

dynamic获取类型可变的json对象

使用dynamic获取类型可变的json对象 Dictionary<string, object> dict = new Dictionary<string, object>(); List<dynamic> lst = new List<dynamic>() { new { aa = 1, bb = "2" } }; Type type = lst[0].GetType(); var ps = type.GetProperties();

c# 确定dynamic类型的数据对象是否存在某个属性

原文:c# 确定dynamic类型的数据对象是否存在某个属性 public static bool IsPropertyExist(dynamic data, string propertyname) { if (data is ExpandoObject) return ((IDictionary<string, object>)data).ContainsKey(propertyname); return data.GetType().GetProperty(propertyname) !

使用jni直接访问java对象中的字段

Java类:UserInfo public class UserInfo { static { System.loadLibrary("userinfo"); } // 从JNI中直接访问字段 public String mUserName; public int mUserAge; public long mMoney; public UserInfo() { } public int getUserAge() { return mUserAge; } public native v

C#高级编程七十天----dynamic类型

dynamic类型 C#新增了dynamic关键字,正是因为这一个小小的关键字,C#像前迈进了一大步. dynamic是一个类型关键,声明为dynamic的类型与"静态类型"(这里的静态是指编译时确定的类型,例如int,double类型)相比最大的特定它是"动态类型",它会在运行时尝试调用方法,这些方法的存在与否不是编译时期检查的,而是在运行时查找,如果方法存在并且参数正确,会正确调用,否则会抛出异常. 案例: dynamic d = Console.Out; dy

OpenCV访问Mat对象中数据时发生异常---Mat中的数据访问

7.1和7.1.1由于越狱不成熟,半完美越狱后电脑上无法访问系统越狱目录,如var usr 等等. 今天有些意外地发现,可以在电脑上使用手机的越狱目录我手机 i4 7.1.1 联通 半完美越狱,没装Afc2Add,也没装Appsync 附上  --->我的半完美越狱过程 好了,下面直接正题 一.前提,必须安装ifile! 打开ifile,并转到 /var/mobile/media 目录下,然后点击右上角的 [ 编辑 ]如图: 二.点左下角的 + 号创建,如图: 三.点 [ 类型],选择[符号链接

.net core 1.1.0 MVC 控制器接收Json字串 (JObject对象) (二)

.net core 1.1.0 MVC 控制器接收Json字串 (JObject对象) (二) .net core 1.1.0 MVC 控制器接收Json字串 (JObject对象) (一) 上一篇主要是以Form键值对提交的数据,转为Json方式处理,有时我们直接以Body字串提交,我们要解决以下两种方式提交的取值问题: JObject $('#btn_add').click(function (e) { var a = $('#tb_departments').bootstrapTable(

Oracle03——游标、异常、存储过程、存储函数、触发器和Java代码访问Oracle对象

作者: kent鹏 转载请注明出处: http://www.cnblogs.com/xieyupeng/p/7476717.html 1.游标(光标)Cursor 在写java程序中有集合的概念,那么在pl/sql中也会用到多条记录,这时候我们就要用到游标,游标可以存储查询返回的多条数据. 语法: CURSOR  游标名  [ (参数名  数据类型,参数名 数据类型,...)]  IS  SELECT   语句; 例如:cursor c1 is select ename from emp; 游标

redis 系列15 数据对象的(类型检查,内存回收,对象共享)和数据库切换

原文:redis 系列15 数据对象的(类型检查,内存回收,对象共享)和数据库切换 一.  概述 对于前面的五章中,已清楚了数据对象的类型以及命令实现,其实还有一种数据对象为HyperLogLog,以后需要用到再了解.下面再了解类型检查,内存回收,对象共享,对象的空转时长. 1.1   类型检查与命令多态 redis中用于操作键的命令基本上可以分为两种类型,一种是可以对任何的键执行,如:del, expire,rename,type,object 这些命令等,对于这些命令属于多态命令.另一种命令