Java 高级篇
JSON
简介
JSON是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。
特点
-
内容简洁和,层次结构清晰,是一种理想的数据交换语言。
-
易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
-
与XML的区别,XML即是一种数据交换格式,可以一种标记语言,而JSON主要是数据的传输。
对比
这是电话归属地的JSON传输格式和XML的区别,直接肉眼上观察,JSON结构更简单,内容更简介,所以计算机读写JSON的速度肯定比XML快,所以JSON的传输效率高于XML
{"success":"1",
"result":
{"status":"ALREADY_ATT",
"phone":"13800138000",
"area":"010","postno":"100000",
"att":"中国,北京",
"ctype":"中国移动138卡",
"par":"1380013",
"prefix":"138",
"operators":"中国移动",
"style_simcall":"中国,北京",
"style_citynm":"中华人民共和国,北京市"
}
}
<?xml version="1.0" encoding="UTF-8" ?>
<root id="1">
<success status="200" key="12sr">1</success>
<result>
<status>ALREADY_ATT</status>
<phone>13800138000</phone>
<area>010</area>
<postno>100000</postno>
<att>中国,北京</att>
<ctype>中国移动138卡</ctype>
<par>1380013</par>
<prefix>138</prefix>
<operators>中国移动</operators>
<style_simcall>中国,北京</style_simcall>
<style_citynm>中华人民共和国,北京市</style_citynm>
</result>
</root>
JSON解析方式
Gson:谷歌公司推出的Json解析工具
- Gson的应用主要为toJson与fromJson两个转换函数,无依赖,不需要例外额外的jar,能够直接跑在JDK上。
- 类里面只要有get和set方法,Gson完全可以将复杂类型的json到bean或bean到json的转换,是JSON解析的神器。
FastJson:阿里巴巴推出的Json解析工具
-
FastJson在复杂类型的Bean转换Json上会出现一些问题,可能会出现引用的类型,导致Json转换出错,需要制定引用。
-
FastJson采用独创的算法,将parse的速度提升到极致,超过所有json库。
Jackson:Jackson是比较著名的一个解析工具
- Jackson 是当前用的比较广泛的,用来序列化和反序列化 json 的 Java 的开源框架
- Jackson 社 区相对比较活跃,更新速度也比较快,是最流行的 json 解析器之一
区别
- FastJson的性能优于Gson,但是处理复杂类型时可能会出现一些错误,到现在还有很多BUG没修。
- Gson的功能非常的齐全。
- Jakson性能也非常出色,但是将核心功能拆分成三个模块,有Jar依赖。
如何选择?
新手学习选择Gson,其无依赖,只要一个Jar,我们不考虑性能问题。
Gson解析Json
普通解析
由于json格式是key-value的,所以我们可以用Map进行接收
public static void main(String[] args) {
//实例化一个Gson解析工具
Gson gson = new Gson();
//定义一个Json字符串
String json="{\"success\":\"1\",\n" +
" \"result\":\n" +
" {\"status\":\"ALREADY_ATT\",\n" +
" \"phone\":\"13800138000\",\n" +
" \"area\":\"010\",\"postno\":\"100000\",\n" +
" \"att\":\"中国,北京\",\n" +
" \"ctype\":\"中国移动138卡\",\n" +
" \"par\":\"1380013\",\n" +
" \"prefix\":\"138\",\n" +
" \"operators\":\"中国移动\",\n" +
" \"style_simcall\":\"中国,北京\",\n" +
" \"style_citynm\":\"中华人民共和国,北京市\"\n" +
" }\n" +
"}";
//用Map接收一下字符串
HashMap hashMap = gson.fromJson(json, HashMap.class);
for (Object o : hashMap.keySet()) {
System.out.println(o+"=="+hashMap.get(o));
}
}
结果
result=={status=ALREADY_ATT, phone=13800138000, area=010, postno=100000, att=中国,北京, ctype=中国移动138卡, par=1380013, prefix=138, operators=中国移动, style_simcall=中国,北京, style_citynm=中华人民共和国,北京市}
success==1
实体类接收
我们想把Json字符串转换成对象我们要先创建一个对象,与Json字符串进行匹配,这样我们就可以轻松将字符串转换成我们可以直接操作的对象,当然这个字符串属性比较多,不过IDEA有很多Json转实体类的插件,非常的便捷。
public static void main(String[] args) {
Gson gson = new Gson();
String json="{\"success\":\"1\",\n" +
" \"result\":\n" +
" {\"status\":\"ALREADY_ATT\",\n" +
" \"phone\":\"13800138000\",\n" +
" \"area\":\"010\",\"postno\":\"100000\",\n" +
" \"att\":\"中国,北京\",\n" +
" \"ctype\":\"中国移动138卡\",\n" +
" \"par\":\"1380013\",\n" +
" \"prefix\":\"138\",\n" +
" \"operators\":\"中国移动\",\n" +
" \"style_simcall\":\"中国,北京\",\n" +
" \"style_citynm\":\"中华人民共和国,北京市\"\n" +
" }\n" +
"}";
Phone phone = gson.fromJson(json, Phone.class);
System.out.println(phone.getResult());
System.out.println(phone.getSuccess());
System.out.println(phone.toString());
}
结果
Phone{success='1'
, result=ResultBean{status='ALREADY_ATT'
, phone='13800138000'
, area='010'
, postno='100000'
, att='中国,北京'
, ctype='中国移动138卡', par='1380013'
, prefix='138'
, operators='中国移动'
, style_simcall='中国,北京'
, style_citynm='中华人民共和国,北京市'
}
}