我们在.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. 非递归创建二叉树( C++队列 )

    非递归按照 层序 创建二叉树,利用 队列(即可先进先出特点)存放已访问的结点元素的地址. 初始化:front=rear= -1: 每储存一个结点元素 rear+1 ,利用 rear%2==0 来使 f ...

  2. 了解学习JS中this的指向

    [转] 首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问 ...

  3. Maya Plugin 编译Maya插件

    Maya自身的功能就已经非常强大了,但是更棒的是它的扩展性非常强,提供API让用户自己来编写插件Plugin.Maya的插件主要是两种,一种是用C++编写的,后缀为".mll",另 ...

  4. linq,sql,lambda转换工具(推荐新手,初学者多多使用)

    http://files.cnblogs.com/CielWater/Linqer.rar Linqer用于将sql语句转换为linq语句(暂不支持多表连接查询) http://files.cnblo ...

  5. PHP中GBK和UTF8乱码解决方案

    我用的appserv-win32-2.5.10做的环境,装这个包的时候用默认的utf8编码.在写数据库连接文件时,写成: $conn = mysql_connect("$host" ...

  6. Signing Data

    Signing Data with CNG http://msdn.microsoft.com/en-us/library/windows/desktop/aa376304(v=vs.85).aspx

  7. Execel(导出新方法):

    #region 新方法 //var sbHtml = new StringBuilder(); //sbHtml.Append("<table border='1' cellspaci ...

  8. [skill] C++ delete VS delete []

    delete 用来删除 new 返回的对象. 先调用对象的析构,然后释放指针指向的内存. delete[] 用来删除 new [] 返回的对象. 先调用数组中每一个对象的析构,然后释放指针指向的内存.

  9. jquety

    .html() //能够获取元素里的内容包括标签: .text()  //只能获取到元素里的内容 .val()  //可以得到元素的value值 $(this).index()  //得到点时间发生的 ...

  10. 用js加密你的重要信息

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...