我们在.net中处理json数据时,经常需要定义相应的类。比如json数据:{ "name" : "hello", "age" : 18 },则需要定义相应的类,包含属性 name、age。

如果不想定义那些烦人的类怎么办?这就用到了.net 4.0的动态类型。

1、自定义JavaScriptConverter

 /// <summary>
/// json转dynamic的转换器
/// </summary>
public class JsonDynamicConverter : System.Web.Script.Serialization.JavaScriptConverter
{
/// <summary>
/// 自动定义反序列化
/// </summary>
/// <param name="dictionary"></param>
/// <param name="type"></param>
/// <param name="serializer"></param>
/// <returns></returns>
public override object Deserialize(IDictionary<string, object> dictionary, Type type, System.Web.Script.Serialization.JavaScriptSerializer serializer)
{
if (dictionary == null)
throw new ArgumentNullException("dictionary"); if (type == typeof(object))
{
return new JsonDynamicObject(dictionary);
} return null;
} /// <summary>
/// 序列化
/// </summary>
/// <param name="obj"></param>
/// <param name="serializer"></param>
/// <returns></returns>
public override IDictionary<string, object> Serialize(object obj, System.Web.Script.Serialization.JavaScriptSerializer serializer)
{
throw new NotImplementedException();
} /// <summary>
/// 支持的类型
/// </summary>
public override IEnumerable<Type> SupportedTypes
{
get { return new ReadOnlyCollection<Type>(new List<Type>(new Type[] { typeof(object) })); }
}
}

2、定义JsonDynamicObject

 /// <summary>
/// 代表json的动态对象
/// </summary>
public class JsonDynamicObject : System.Dynamic.DynamicObject
{
private IDictionary<string, object> dictionary { get; set; } /// <summary>
/// 构造动态json对象
/// </summary>
/// <param name="dictionary"></param>
public JsonDynamicObject(IDictionary<string, object> dictionary)
{
this.dictionary = dictionary;
} /// <summary>
/// 获取成员
/// </summary>
/// <param name="binder"></param>
/// <param name="result"></param>
/// <returns></returns>
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
if (this.dictionary.ContainsKey(binder.Name) == false)
{
result = null;
return true;
} result = this.dictionary[binder.Name]; if (result is IDictionary<string, object>)
{
result = new JsonDynamicObject(result as IDictionary<string, object>);
}
else if (result is ArrayList && (result as ArrayList).Count > && (result as ArrayList)[] is IDictionary<string, object>)
{
result = new List<dynamic>((result as ArrayList).ToArray().Select(x => new JsonDynamicObject(x as IDictionary<string, object>)));
}
else if (result is ArrayList)
{
result = new List<dynamic>((result as ArrayList).ToArray());
} this.dictionary[binder.Name] = result; return this.dictionary.ContainsKey(binder.Name);
} /// <summary>
/// 转换json字符串到dynamic
/// </summary>
/// <param name="json"></param>
/// <returns></returns>
public static dynamic FromJson(string json)
{
var jsSerializer = new System.Web.Script.Serialization.JavaScriptSerializer();
jsSerializer.RegisterConverters(new[] { new JsonDynamicConverter() });
return jsSerializer.Deserialize(json, typeof(object));
}
}

3、具体用法

 var json = "{ \"name\" : \"hello\", \"age\" : 18 }";
var person = JsonDynamicObject.FromJson(json);
Console.WriteLine("name:{0},age:{1}", person.name, person.age);

是不是再也不用定义那些烦人的类了~

.net动态类型在处理json数据方面的应用的更多相关文章

  1. 循序渐进VUE+Element 前端应用开发(27)--- 数据表的动态表单设计和数据存储

    在我们一些系统里面,有时候会需要一些让用户自定义的数据信息,一般这些可以使用扩展JSON进行存储,不过每个业务表的显示项目可能不一样,因此需要根据不同的表单进行设计,然后进行对应的数据存储.本篇随笔结 ...

  2. 【.net深呼吸】动态类型(高级篇)

    前面老周给大家介绍了动态类型使用的娱乐级别用法,其实,在很多情景下,娱乐级别的用法已经满足需求了. 如果,你想自己来控制动态类型的行为和数据的存取,那么,就可以考虑用今天所说的高大上技术了.比如,你希 ...

  3. 最新版ABP 动态WebAPI 日期转json带T的解决方案| ABP DateTIme Json format

    ABP动态webapi返回的json数据中,日期时间带T还有毫秒数的问题,在以往的版本中可以使用下面方法解决: 在XXXAbpWebApiModule中加上下面的代码: 很老的很老的版本有效: pub ...

  4. C# dynamic类型序列化和反序列化之Newtonsoft.Json,动态解析远端返回的jSON数据

    一.说明 1.Newtonsoft.Json 中的Linq To Json中提供了方便的json数据查询.修改等操作. 例如:JObject,JArray 2.在JObject.FromObject( ...

  5. C# JToken类的使用,实现解析动态json数据、遍历、查找

    在原来解析json数据是,一般都是用反序列化来实现json数据的解读,这需要首先知道json数据的结构并且建立相应的类才能反序列化,一旦遇到动态的json数据,这种方法就不使用. 为了解决动态解析js ...

  6. ASP.NET实现二维码 ASP.Net上传文件 SQL基础语法 C# 动态创建数据库三(MySQL) Net Core 实现谷歌翻译ApI 免费版 C#发布和调试WebService ajax调用WebService实现数据库操作 C# 实体类转json数据过滤掉字段为null的字段

    ASP.NET实现二维码 using System;using System.Collections.Generic;using System.Drawing;using System.Linq;us ...

  7. 处理Json数据中的日期类型.如/Date(1415169703000)/格式

    在asp.net mvc后台返回到视图中的json数据中想对数据进行操作,发现日期类型无法直接进行操作,需要转换为指定格式才行.在网上也搜了下方法也很多,觉得有点麻烦,最终使用正则搞定了,分享下: v ...

  8. Json.net实现方便的Json转C#(dynamic动态类型)对象

    以前需要将一段json字符串转换为C#对象时,一般都是定义一个与之对应的实体类来接收.这样做有一个很大的缺点,就是当字符串特别长,属性特别多,又有嵌套时,手敲这个实体类就非常痛苦. 比如之前做的一个接 ...

  9. ArcGIS Server 10.2 实战(一)Asp.net MVC与JSON数据妙用实现动态生成要素图层

    今年7月刚刚发布的ArcGIS 10.2为GIS的web开发带来了一个很实在的功能,JSON转要素.以往GIS图层外部数据(如文本数据,数据库数据)动态地写入地图服务中的图层是一件不可想象的事情,如今 ...

随机推荐

  1. Redis 配置文件总结

    1.1 文件说明 1.1.1    主要文件说明 1 redis-server Redis服务器 2 redis-cli Redis命令行客户端 3 redis-benchemark redis-be ...

  2. .net获取DataTable里面的值(asp.net遍历获取datatable的值)

    方法一:for (int i =0; i < dtb_xx.Rows.Count; i++ ){response.write dtb_xx.Rows[i]["szxxxx1" ...

  3. Linux用户密码重置方法

    方法一: 启动时,随便按一个键,空格即可(不能是回车),让其停留在如下界面 按e编辑 在UTF-8后面添加init=/bin/sh init=/bin/sh 根据上面提示,按Ctrl+x启动得下图 输 ...

  4. Node.js实现CORS跨域资源共享

    什么是CORS CORS(Cross-origin resource sharing),跨域资源共享,是一份浏览器技术的规范,用来避开浏览器的同源策略 简单来说就是解决跨域问题的除了jsonp外的另一 ...

  5. UI--UIPickerView和UIDatePicker的总结

    回到顶部 UIPickerView的主要方法和城市选择器的修正 UIPickerView只有两个数据源方法.要想完整地显示出PickerView,需要结合使用代理方法 数据源方法: // 一共有多少组 ...

  6. easyUI下拉列表三级联动

    首先是先想好数据库的搭建,通过地区id,地区名称,上级地区id就可以实现,所有省市区的数据 例如: DAO层 service层 Servlet 页面 <!DOCTYPE html> < ...

  7. Android课程---添加黑名单的练习(课堂讲解)

    DBHelper.java package com.hanqi.test3; import android.content.Context; import android.database.sqlit ...

  8. HBuilder从下载到使用

    听别人谈论这货,于是决定长长见识,见见世面,便屁颠屁颠到网上下一个,满怀好奇的研究了一下.对用过eclipse这款软件的人来说,上手非常容易. ☆ 准备工作 ① 确认自己的电脑连接网络,能下载东西. ...

  9. Rails--抛出异常

    begin ... rescue Exception => e ... end

  10. c# TimeSpan

    转自:http://blog.163.com/y_p_xu/blog/static/17085710220116472030543/ /// <summary>        /// 将时 ...