1. JSON简介
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,基于 ECMAScript的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。适合于服务器与前台脚本语言的交互,同时也易于机器解析和生成。
2. JSON历史
在2001年,JSON被道格拉斯•克罗克福德(Douglas Crockford)创建,并在RFC4627与IETF(因特网工程任务组)标准中被规定;根据规范,JSON的IANA(互联网数字分配机构)媒体类型是application/json,文件类型是json。它基于JavaScript语言,是在JavaScript的数组(array)和对象(object)基础上发展而来。任何支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等。但是对象和数组是比较特殊且常用的两种类型。
3. JSON常用类型
3.1. 数组表示
数组使用[ ]包含所有元素,每个元素用逗号分隔, 元素可以为任意值。比如: [“abc”, 123, true, null] 访问其中的元素,使用索引号,从0 开始。
3.2. 对象表示
对象使用{ }包含一系列无序的 Key-Value 键值对表示,其中Key和Value之间用冒号分割,每个key- value之间用逗号分割。比如: {“a”:“1b”, “b”:“2c”, “3”: 2 },访问其中的元素,使用索引号,从0 开始。
4. JSON与XML对比
4.1. 可读性:
JSON和XML的可读性可谓不相上下,一边是建议的语法,一边是规范的标签形式,比较难分出胜负。
4.2. 可扩展性
XML天生有很好的扩展性,JSON当然也有,没有什么是XML能扩展,JSON不能的。
4.3. 编码难度
XML有丰富的编码工具,比如Dom4j、JDom等,JSON也有json.org提供的工具,但是JSON的编码明显比XML容易许多,即使不借助工具也能写出JSON的代码,可是要写好XML就不太容易了。相对来说json的书写就容易许多。
4.4. 解码难度
XML的解析得考虑子节点父节点,让人头昏眼花,而JSON的解析难度几乎为0。
4.5. 流行度
XML已经被业界广泛的使用,但是在Ajax这个特定的领域,一定是XML让位于JSON的。
5. JSON和JS互转
使用 JSON.parse() 方法从JSON字符串转换为JS对象
var obj = JSON.parse('{"a": "Hello", "b": "World"}');
结果是
{a: 'Hello', b: 'World'}
使用 JSON.stringify() 方法从JS对象转换为JSON字符串
var json = JSON.stringify({a: 'Hello', b: 'World'});
结果是
'{"a": "Hello", "b": "World"}'
6. JAVA的第三方JSON处理库
FastJson: 阿里巴巴开发的 JSON 库,性能十分优秀。如今国内使用得比较多。
Gson: 谷歌开发的 JSON 库,功能十分全面。
Jackson: 社区十分活跃且更新速度很快。可以轻松的将Java对象转换成json对象和xml文档
6.1. FastJson
FastJson可以通过使用maven引入alibaba的fastjson依赖,也可以引入其jar包
6.1.1. FastJson常用的转换方法
//将 JSON 对象或 JSON 数组转化为字符串
toJSONString(Object obj)
//将字符串转换为Object
parse()
//从字符串解析 JSON 对象
parseObject()
//从字符串解析 JSON 数组
parseArray()
//JSONObject反序列化
toJavaObject(JSON json, Class<T> clazz)
6.2. GSON的引入和使用
FastJson可以通过使用maven引入gson依赖,也可以引入其jar包
6.2.1. GSON常用的转换方法
//将字符串转换为对象
fromJson(String json, Class<T> classOfT)
//将对象转换为json字符串
toJson(Object obj)
将整个json解析为一颗树
toJsonTree(Object src)
6.3. JackJson
JackJson可以通过maven引入jackson-core、jackson-databind和jackson-annotation依赖,也可以引入相应的jar包
6.3.1. Jackjson常用的转换方法
ObjectMapper是JSON操作的核心,Jackson的所有JSON操作都是在ObjectMapper中实现。
ObjectMapper有多个JSON序列化的方法,可以把JSON字符串保存FileOutputStream等不同的介质中。
//把arg1转成json序列,并保存到arg0文件中。
writeValue(File arg0, Object arg1)
//把arg1转成json序列,并保存到arg0输出流中。
writeValue(OutputStream arg0, Object arg1)
//把arg0转成json序列,并把结果输出成字节数组。
writeValueAsBytes(Object arg0)
//把arg0转成json序列,并把结果输出成字符串。
writeValueAsString(Object arg0)