博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Json升级带来的影响
阅读量:3602 次
发布时间:2019-05-20

本文共 1439 字,大约阅读时间需要 4 分钟。

Json 官方提供的代码没有设置版本。因此,这里根据代码变化的最新日期作为版本以示区别。
1、Json.v2008.04.25 以前版本
在Json.v2008.04.25 版本(包含V2008.04.25)以前,JSONObject对象在转换Object对象实例的时候,使用的是getMethods()这个方法。
getMethods()获取在当前被转换为Json的类以及在这个类所有父类中声明的方法。
其中,在java.lang.Object有一个getClass()方法,获得当前类的全名称。
这个方法在转换过程中被执行,因此在转换后的Json数据中,除了必要的属性外,还包括一个 class 为主键的值对。
比如,对于一个包名为 org.teamlet.ws.business 类名为Department 的类,经过Json转换后,在Json数据中会有一个值对。
主键(key)为 class ; 值(value)为当前的类全名:org.teamlet.ws.business.Department 
这种情况有利也有弊:
好处是在服务端不需要做任何设置,从Json数据中获得相应的class就可以直接完成从json到java的转换。
问题是,
第一:暴露了服务端的信息;
第二:使得Java客户端必须使用和服务端完全一样的包名,原本纯粹的数据之间的转换增加了约束条件;
第三:对于其他语言(目前实现的有PHP、C/C++、C#、JavaScript)要额外设置这个class的值。
2、Json.v2008.06.25以后版本
在Json.v2008.06.25 版本(包含V2008.06.25)以后的版本,JSONObject对象在转换Object对象实例的时候,增加了一个参数:boolean includeSuperClass 。
如果参数设置为true,则效果和Json v2008.04.25一样,使用的是getMethods()这个方法。
如 果参数设置为false,则会使用getDeclaredMethods()这个方法,这个方法只获取当前类声明的方法,因此父类 java.lang.Object中一个getClass()方法不能获得,在转换后的Json数据中就没有了上面提到的以class为主键的值对。
这样,为客户端带来了很大的灵活性。客户端可以任意构造包含业务属性的类,而不必关心是类的包名是什么。而这些包名对于PHP、JavaScript是没有用的。
但同时也带来了问题,如何在服务端转换为对应的业务需要实例?
3、与Json-lib的差别
Json-lib是一个基于Json格式开发的完全不同于Json官方的开源工具。
在Json-lib中使用的就是后一种Json的转换,就是使用getDeclaredMethods()方法,在Json数据中不包括class值对。(除此之外还有其他的不同,偏离了主题不再详述)
使用Json-lib进行数据传输需要在服务端做根据业务做一些配置工作。
4、对应用的影响
restlet用的是Json早期的版本,webservice组件也因此受到影响。
好在webservice组件同时支持Json和Json-lib,同时兼容并不困难。
只是客户端的变化带来较大的影响,特别是对已经部署即将使用的系统。
Json升级后传输和转换方面的性能不会变化太大;
服务端变为统一的转换形式,丧失的是即插即用、零配置的特性。

转载地址:http://ukizn.baihongyu.com/

你可能感兴趣的文章
c语言---预处理的功能 1: 宏定义 2:文件包含 3:条件编译
查看>>
串口通信协议 UART+I2C+SPI
查看>>
[project X] tiny210(s5pv210)上电启动流程(BL0-BL2)
查看>>
[project X] tiny210(s5pv210)从存储设备加载代码到DDR
查看>>
[uboot] (第一章)uboot流程——概述
查看>>
[uboot] (第二章)uboot流程——uboot-spl编译流程
查看>>
[uboot] (第三章)uboot流程——uboot-spl代码流程
查看>>
[uboot] (番外篇)global_data介绍
查看>>
[uboot] (番外篇)uboot relocation介绍
查看>>
03. Uboot启动流程详解
查看>>
流媒体协议---ORTP库简介 https://blog.csdn.net/suer0101/article/details/7333267
查看>>
[Linux]竞态→互斥机制(中断屏蔽、原子操作、自旋锁、信号量)
查看>>
CSDN markdown编辑器
查看>>
c语言---(没有字符串,故以数组实现)字符串:strlen、sizeof、length、size strcpy 和其他函数fopen sprintf memset memcpy
查看>>
网络协议---TCP---socket bind listen accept listen函数 未决连接队列
查看>>
linux---大小端
查看>>
c语言---内存各分区+动态内存分配malloc/free和new/delet
查看>>
c语言---数据类型转换(换一种规则读取补码)
查看>>
网络协议---TCP---协议概述
查看>>
linux---子网划分及子网掩码计算方法
查看>>