使用dynamic获取类型可变的json对象

标题可能有点含糊不清

我这个例子的来源是,对方会返回给我json,不过成功的json与失败的json是不同的对象

我想用一个方法获取到这个对象的所有属性并打印到log中

因为是动态变化的,所以第一个想到的就是用dynamic

下面是dynamic例子

List<dynamic> lst = new List<dynamic>() { new { aa = 1, bb = "2" } };
            Type type = lst[0].GetType();
            var ps = type.GetProperties();

这样是可以取到属性的,但是(总有个但是)

string json = "{\"banme\":\"asd\"}";
            dynamic dobj = JsonConvert.DeserializeObject(json, typeof (object)) as dynamic;
            var s = dobj.GetType().GetProperties();
            var i = dobj.banme;

这个反序列回来的对象,我们是可以获取到banme属性的值asd的,但是当我们去s里查看属性的时候,却没有banme这个属性,仔细看了一下dobj的属性是 dobj.GetType() {Newtonsoft.Json.Linq.JObject} dynamic {System.RuntimeType}

只是我们用了dynamic动态获取到了那个banme属性的值

暂时还没找到获取动态属性的方法

所以我采用的下一种方法

JavaScriptSerializer siSerializer=new JavaScriptSerializer();
            dynamic dobj2 = siSerializer.Deserialize<dynamic>(json);
            foreach (var ss in dobj2.Keys)
            {
                var ii = dobj2[ss];
            }

微软的这个json序列化工具,反序列化回来一个键值对的对象,那么只要遍历keys就可以获取的他的属性啦

这样,我就可以把完全未知的对象属性都记录到日志里了。

到此还不算结束,其实这种方法不好,如果属性也是一个类型,就很难进一步动态获取了,还是直接转成对象,通过对象属性来获取来的实惠。

到此还不算结束,后来我想了一下,既然是记录日志,直接把json记录下来就好了,干嘛转来转去呢……全剧终

posted @ 2015-10-20 16:58  kee  阅读(4964)  评论(1编辑  收藏  举报