我们在做开发的时候,很多时候需要和Json数据格式打交道,如Web开发里面,很多时候,数据通过Json进行传递到页面上,然后在进行处理的。而使用Json的时候,我们很多时候会涉及到几个序列化对象的使用:DataContractJsonSerializer,JavaScriptSerializer 和 Json.NET。大多数人都会选择性能以及通用性较好Json.NET,这个不是微软的类库,但是一个开源的世界级的Json操作类库,从下面的性能对比就可以看到它的其中之一的性能优点。

Json.NET能很好序列化或者反序列化.NET的各种类型数据,而且它的另一个优点,是可以配置Attribute属性,指定输出的属性的名称或者是否输出,这点我非常喜欢。

JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式。JSON是“名值对”的集合。结构由大括号'{}',中括号'[]',逗号',',冒号':',双引号'“”'组成,包含的数据类型有Object,Number,Boolean,String,Array, NULL等。

1、在Web中使用Json数据

在我的基于MVC+EasyUI的Web开发框架中,Web界面层大量使用了Ajax方式获取所需数据,然后绑定到树列表控件或者其他界面控件里面,在前面的一些Web框架随笔系列里面,我介绍过很多Json格式的操作。

1)基于MVC4+EasyUI的Web开发框架经验总结(3)- 使用Json实体类构建菜单数据

2)基于MVC4+EasyUI的Web开发框架经验总结(2)- 使用EasyUI的树控件构建Web界面

如在MVC的视图里面,通过Web请求的Json数据后初始化树控件的代码如下所示

    //初始化组织机构列表function initDeptTreeview() {$("#loading").show();$('#treeDept').tree({url: '/User/GetMyDeptTreeJson?userId=@Session["UserId"]',onClick: function (node) {loadDataByOu(node.id);}});$("#loading").fadeOut(500);}

或者用户角色的初始化界面代码

                $('#lbxRoles').empty();$.getJSON("/Role/GetRolesByUser?r=" + Math.random() + "&userid=" + info.ID, function (json) {$.each(json, function (i, item) {$('#lbxRoles').append('<option value="' + item.ID + '">' + item.Name + '</option>');});});

前面说过,Json.NET具有属性配置功能,可以指定某个属性是否输出,或者输出的名称转义等。默认情况下,Json.Net序列化后结果中的字段名称和类中属性的名称一致,如果想自定义序列化后的字段名称,可以使用JsonProperty。

我们知道,EasyUI的Tree控件里面,它的数据格式,除了一个id和text是必须的之外,它的很多属性是可选的,也就是说在Json里面,可以不输出某个属性的内容。这个通过配置

[JsonProperty( NullValueHandling = NullValueHandling.Ignore)]

就可以忽略某个属性的输出了,如果这个属性的值为null的话。

树控件的数据还有一个checked属性, 如果没有转义功能,我们需要指定属性为checked, 而checked是C#里面的保留关键字,不能使用,那么就没办法了。而Json.NET提供了转义功能的配置Attribute,很好解决问题,如下所示。

        [JsonProperty(PropertyName = "checked", NullValueHandling = NullValueHandling.Ignore)]public bool? Checked { get; set; }

因此整个EasyUI的Tree数据对象信息,在C#里面可以定义为如下所示(这里可以忽略DataContract、DataMember的定义)。

    /// <summary>/// 定义EasyUI树的相关数据,方便控制器生成Json数据进行传递/// </summary>[DataContract][Serializable]public class EasyTreeData{/// <summary>/// ID/// </summary>[DataMember]public string id { get; set; }/// <summary>/// 节点名称/// </summary>[DataMember]public string text { get; set; }/// <summary>/// 是否展开/// </summary>[JsonProperty(NullValueHandling = NullValueHandling.Ignore)][DataMember]public string state  { get; set; }/// <summary>/// 图标样式/// </summary>[DataMember]        [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]public string iconCls { get; set; }
        [JsonProperty(PropertyName = "checked", NullValueHandling = NullValueHandling.Ignore)][DataMember(Name="checked")]public bool? Checked { get; set; }/// <summary>/// 子节点集合/// </summary>[DataMember]public List<EasyTreeData> children { get; set; }

使用上的实体类,并使用Json.NET来序列化我们的数据,我们可能得到下面的Json数据。

[{id: "-1",text: "无",state: "open",    checked: true,children: [ ] },{id: "6",text: "总经办",state: "open",iconCls: "icon-group",children: [ ]}
]

我们从上面的Json数据可以看到,Checked属性顺利转换为checked的名称属性,标记为[JsonProperty(NullValueHandling = NullValueHandling.Ignore)] ,而值为null的属性,将不会出现在Json的字符串里面了。

这个在某种情形下,正好就是我们所需要的。

2、在微信接口开发中使用Json

微信API的接口,大量使用了Json数据,不仅很多返回的数据是使用Json表达,而且其Post的数据,也多数使用Json数据格式,如在我的前两篇随笔《C#开发微信门户及应用(5)--用户分组信息管理》 、《C#开发微信门户及应用(4)--关注用户列表及详细信息管理

里面介绍的内容,微信的很多接口都使用了Json数据。

如返回关注者列表的Json数据,就是如下所示。

{"total":2,"count":2,"data":{"openid":["","OPENID1","OPENID2"]},"next_openid":"NEXT_OPENID"}

创建用户分组,返回的数据格式如下,同样也是Json数据。

{"group": {"id": 107, "name": "test"}
}

通过下面基于Json.NET的Json数据的转换,就可以顺利从Json字符串转换为相应的实体对象了。

    /// <summary>/// Json字符串操作辅助类/// </summary>public class JsonHelper<T> where T : class, new(){/// <summary>/// 检查返回的记录,如果返回没有错误,或者结果提示成功,则不抛出异常/// </summary>/// <param name="content">返回的结果</param>/// <returns></returns>private static bool VerifyErrorCode(string content){if (content.Contains("errcode")){ErrorJsonResult errorResult = JsonConvert.DeserializeObject<ErrorJsonResult>(content);//非成功操作才记录异常,因为有些操作是返回正常的结果({"errcode": 0, "errmsg": "ok"})if (errorResult != null && errorResult.errcode != ReturnCode.请求成功){string error = string.Format("微信请求发生错误!错误代码:{0},说明:{1}", (int)errorResult.errcode, errorResult.errmsg);LogTextHelper.Error(errorResult);throw new WeixinException(error);//抛出错误}}return true;}/// <summary>/// 转换Json字符串到具体的对象/// </summary>/// <param name="url">返回Json数据的链接地址</param>/// <returns></returns>public static T ConvertJson(string url){HttpHelper helper = new HttpHelper();string content = helper.GetHtml(url);VerifyErrorCode(content);T result = JsonConvert.DeserializeObject<T>(content);return result;}
}

而如果要把对象转换为Json字符串格式的数据,那么代码也很简单。

JsonConvert.SerializeObject(obj, Formatting.Indented);

使用Json.NET来序列化所需的数据相关推荐

  1. python json dumps 自定义_Python json.dumps 自定义序列化操作

    def login_ajax(request): if request.method == "GET": return render(request, 'login_ajax.ht ...

  2. javascript数组——新建数组、访问数组、遍历数组的方法、数组对象的方法、冒泡排序算法、json的正反序列化

    目录 数组 通过构造函数的三种方法 字面量创建数组方式 访问数组 遍历数组的方法 遍历:遍历就是把数组中的元素从头到尾都访问一次 操作数组对象的方法 删除和添加 delete与Vue.delete区别 ...

  3. Java下利用Jackson进行JSON解析和序列化

    Java下利用Jackson进行JSON解析和序列化 转载于:https://www.cnblogs.com/jing1617/p/7009122.html

  4. 使用JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串的长度超过了为 maxJsonLength属性...

    使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错.字符串的长度超过了为 maxJsonLength 属性设置的值. 解决办法是在web.config增加如下节点到& ...

  5. c 语言 json序列化,C#中json字符串的序列化和反序列化 – 万能的聪哥 – 博客园...

    今日写番茄闹钟程序,打算添加日程安排内容,使用到json格式文件的序列化和反序列化: 什么是Json ? Json[ 它是一个轻量级的数据交换格式,我们可以很简单的来读取和写它, 并且它很容易被计算机 ...

  6. C#开发笔记之19-如何用C#实现优雅的Json解析(序列化/反序列化)方案?

    本文由 比特飞 原创发布,欢迎大家踊跃转载. 转载请注明本文地址:C#开发笔记之19-如何用C#实现优雅的Json解析(序列化/反序列化)方案? | .Net中文网. C#开发笔记概述 另外可参考文章 ...

  7. 使用Json.net进行序列化时,如何更改属性名称?

    本文翻译自:How can I change property names when serializing with Json.net? I have some data in a C# DataS ...

  8. json,pickle,shelve序列化和反序列化

    1.简介 ●  json:用于字符串 和 python简单数据类型(list,dict...)间进行转换:字符串<--->python简单数据类型 ●  pickle:用于python特有 ...

  9. 江在川上曰:js中的JSON解析和序列化

    江在川上曰:js中的JSON解析和序列化 JSON解析和序列化 JSON是javascript的一个严格的子集,利用了javacript中的一些模式来表示结构化数据.他只是一种数据格式,并非一种编程语 ...

最新文章

  1. Spring事务管理 与 SpringAOP
  2. 操作系统原理第四章:线程
  3. PAT Basic 1032
  4. php安全编程—sql注入攻击
  5. BFS(广度优先搜索算法)
  6. 函数使用了堆栈的字节超过_在C语言中如何访问堆栈?
  7. 使用mysqldump备份
  8. 项目风险管理课程学习
  9. idea下载Mybatis插件
  10. elasticsearch报错java.lang.IllegalStateException: failed to obtain node locks, tried [[/usr/local/elas
  11. 2022年陕西省职业院校技能大赛中职组网络安全赛项规程
  12. java文件上传下载接口_java 文件上传下载
  13. 计算机中文件的分类,如何有效对电脑文件夹进行分类?
  14. 第4章数据库的查询、视图和游标
  15. 计算机维修培训教材,计算机芯片级维修中心芯片级维修培训教材.pdf
  16. 研究War3编辑器(2):地图编辑器基本操作
  17. 解决ES Data too large问题
  18. Zepeto正加速摆脱“捏脸”应用的传统印象,成为亚洲最大虚拟世界平台
  19. 编程的智慧 强烈推荐
  20. gzp解压命令 linux_Linux gzip命令:压缩文件或目录

热门文章

  1. Linux-重启与压缩命令
  2. EasyUI环境搭建与入门基础语法
  3. 一次作死尝试:将自己的linux用rm -rf /会怎样?结果哭了。。
  4. 操作系统Linux环境下动态分区存储管理的内存分别配回收
  5. qt 实现自己的小笔记本(哼。拿下本本记下来了
  6. seata 如何开启tcc事物_如何能在实战中完成分布式事务?知道这些点很重要
  7. 神策数据:从技术视角看,如何更多、更好、更快地实施A/B试验
  8. 神策数据陈宁:前端国际化技术需求及模型实现
  9. Spring注入方法
  10. SQL Server 2008 R2 系统配置检查器的检查参数和妨碍性问题的解决办法