zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    HDU-1115计算几何
    树形DP入门之HDU 1296
    拓扑排序-POJ1964
    其他一些数状数组的题
    HDU 2852(树状数组plus二分)
    POJ-2155二维树状数组
    HDOJ 1166 敌兵布阵 (线段树)
    codevs 1082 线段树练习3 (线段树)
    codevs 1081 线段树练习2 (线段树)
    codevs 1080 线段树练习(线段树)
  • 原文地址:https://www.cnblogs.com/seriawei/p/8856995.html
Copyright © 2011-2022 走看看