我们在.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. Object-C 1.0 第二章

    1.  输出obc #import <Foundation/Foundation.h> int main(int argc,const char *argv[]) { NSLog(@&qu ...

  2. eclipse安装genymotion插件。

    先发个我自己压缩的genymotion和VirtualBox,下载链接:http://pan.baidu.com/s/1o7wgJiU 1.在安装genymotion之后,打开eclipse,如下图操 ...

  3. [Android]新版的sdk中新建一个android应用,增加的PlaceholderFragment这个静态类发生的事情

    1,首先发生的是有两个布局xml,一个activity_main.xml,一个是fragment_main.xml一开始没在意,后来仔细看了原来是新功能的fragment概念等于多个场景在这个acti ...

  4. chart.js 里添加图表的清单:

    chart.js 里添加图表的清单: var legend = myDoughnut.generateLegend(); $("#chart_legend").html(legen ...

  5. WPF整理-XAML构建后台类对象

    1.XAML 接触WPF的第一眼就是XAML---XAML是用来描绘界面的.其实不然! "Actually, XAML has nothing to do with UI. It's mer ...

  6. WPF中UserControl和DataTemplate

    最新更新: http://denghejun.github.io 前言 前言总是留给我说一些无关主题的言论,WPF作为全新Microsoft桌面或web应用程序显示技术框架, 从08年开始,一直到现在 ...

  7. 第一章-第三题(目前流行的源程序版本管理软件和项目管理软件优缺点)--By梁旭晖

    引用自:http://www.cnblogs.com/WJ1234/p/5285595.htmlhttp://blog.163.com/yuyang_tech/blog/static/21605008 ...

  8. matlab函数大全

    Matlab 图像处理相关函数命令大全 一.通用函数: colorbar  显示彩色条 语法:colorbar \ colorbar('vert') \ colorbar('horiz') \ col ...

  9. 浮点数 (IEEE-754)

    浮点数又称"实数",一个浮点数包含三个部分 符号位(S) 阶码 有效数字 S:阶码:有效数字 浮点数是由科学二级制来表示的. 三种类型的浮点数: 短浮点数(32bit):  S(b ...

  10. jquery autocomplete插件

    jquery autocomplete插件 https://goodies.pixabay.com/jquery/auto-complete/demo.html autocomplete-table ...