json
一、JSON基本认识
JSON是一种轻量级的数据交换格式,它的全称为“JavaScript Object Notation”,当下的服务器与客户端数据交换几乎都是用JSON了,必会JSON解析。
二、JSON的特点
1、JSON比XML的数据传递的有效性高,轻量级的文本数据交换格式
2、JSON完全独立于编程语言和平台
3、JSON的本质是具有特定格式的字符串,具有自我描述性
4、易于人阅读和编写,同时也易于机器解析和生成
三、JSON数据格式(JSON对象、JSON数组)
【详细语法参考】http://www.json.org/json-zh.html
3.1、JSON对象:{ }
结构:{key1:value1,key2:value2,key3:value3}
“key/value”键值对:无序、一个对象用“{}”包括,名称和值间用“:”相隔,对象间用“,”隔开;
一个JSON对象包括多个名称/值对,在花括号里书写
key的数据类型:字符串
value的数据类型:字符串、数值、null、JSON对象、JSON数组
例子:
1 { 2 " name ": "xiaoming ", 3 " blogUrl ": " www.xiaoming.org " 4 }
以key/value键值对形式构建的,正确
{ " name " : " "xiaoming ", "www.xiaoming.org " }没有以key/value键值对形式构建的,错误
3.2、JSON数组:[ ]
结构:[value1,value2,value3]
数组以“[]”包括,数据的对象用逗号隔开
value的数据类型:字符串、数值、null、JSON对象、JSON数组
例子:
[ " 1 ", " cnblogs ", { " name ": " xiaoming ", " blogUrl ": " www.xiaoming.org " } ]
3.3 总结
数组 [ 对象 { 值/对} ]
数组包含对象,对象包含值/对
3.4 json实例
1 { 2 "skill": { 3 "web": [{ 4 "name": "html", 5 "year": "5" 6 }, 7 { 8 "name": "ht", 9 "year": "4" 10 } 11 ], 12 "database": [{ 13 "name": "h", 14 "year": "2" 15 }] 16 } 17 }
【说明】
【1】最外层的对象:遵循键值对:键key---“skill”;值value是":"之后的大括号中的内容{"web".....}
【2】包含两个数组:”web","database";
四、JSON解析方向
1、将Java对象(包括集合)转换成JSON格式字符串;(服务端)
2、将JSON格式字符串转换成Java对象(包括集合)。(客户端)
3、JSON和Java之间的转换关系:
JSON中的对象对应着Java中的对象;
JSON中的数组对应这Java中的集合。
6. JavaBean的书写
6.1 json 对应的javabean的书写规则
步骤1:创建一个与JSON数据对应的JavaBean类(用作存储需要解析的数据)
JSON解析的关键是重点是要根据json数据里面的结构写出一个对应的javaBean,规则是:
1. JSON的大括号对应一个对象,对象里面有key和value(值)。在JavaBean里面的类属性要和key同名
2. JSON的方括号对应一个数组,所以在JavaBeanBean里面对应的也是数组,数据里面可以有值或者对象。
3. 如果数组里面只有值没有key,就说明它只是一个纯数组,如果里面有值有key,则说明是对象数组。
纯数组对应JavaBean里面的数组类型,对象数组要在Bean里面建立一个内部类,类属性就是对应的对象里面的key,建立了之后要创建一个这个内部类的对象,名字对应数组名。
4. 对象里面嵌套对象时候,也要建立一个内部类,和对象数组一样,这个内部类对象的名字就是父对象的key
注:JavaBean类里的属性不一定要全部和JSON数据里的所有key相同,可以按需取数据,也就是你想要哪种数据,就把对应的key属性写出来,注意名字一定要对应
以下有两个JSON文档来说明创建JavaBean类的创建方法
6.2 简单的javaBean的书写
简单的JSON数据1(对象)
1 { 2 "id": 1, 3 "name": "小明", 4 "sex": "男", 5 "age": 18, 6 "height": 175 7 }
步骤1:创建简单的JSON数据对应的JavaBean类
1 package scut.learngson;
2
3 public class EntityStudent {
4 private int id;
5 private String name;
6 private String sex;
7 private int age;
8 private int height;
9
10 public void setId(int id){
11 this.id = id;
12 }
13 public void setName(String name){
14 this.name = name;
15 }
16 public void setSex(String sex){
17 this.sex = sex;
18 }
19 public void setAge(int age){
20 this.age = age;
21 }
22 public void setHeight(int height){
23 this.height = height;
24 }
25 public int getId(){
26 return id;
27 }
28 public String getName(){
29 return name;
30 }
31 public String getSex(){
32 return sex;
33 }
34 public int getAge(){
35 return age;
36 }
37 public int getHeight(){
38 return height;
39 }
40 public void show(){
41 System.out.print("id=" + id + ",");
42 System.out.print("name=" + name+",");
43 System.out.print("sex=" + sex+",");
44 System.out.print("age=" + age+",");
45 System.out.println("height=" + height + ",");
46
47 }
48 }
6.3. 复杂的javaBean的书写
复杂的JSON数据(具备嵌套)
1 { 2 "translation": ["车"], 3 "basic": { 4 "phonetic": "kɑː", 5 "explains": ["n. 汽车;车厢", "n. (Car)人名;(土)贾尔;(法、西)卡尔;(塞)察尔"] 6 }, 7 "query": "car", 8 "errorCode": 0, 9 "web": [{ 10 "value": ["汽车", "车子", "小汽车"], 11 "key": "Car" 12 }, 13 { 14 "value": ["概念车", "概念车", "概念汽车"], 15 "key": "concept car" 16 }, 17 { 18 "value": ["碰碰车", "碰撞用汽车", "碰碰汽车"], 19 "key": "bumper car" 20 } 21 ] 22 }
复杂的JSON数据对应的JavaBean类
1 import java.util.List; 2 3 public class student { 4 public String[] translation; //["车"]数组 5 public basic basic; //basic对象里面嵌套着对象,创建一个basic内部类对象 6 public static class basic{ //建立内部类 7 public String phonetic; 8 public String[] explains; 9 } 10 public String query; 11 public int errorCode; 12 public List<wb> web; //web是一个对象数组,创建一个web内部类对象 13 public static class wb{ 14 public String[] value; 15 public String key; 16 } 17 18 public void show(){ 19 //输出数组 20 for (int i = 0;i<translation.length;i++) 21 { 22 System.out.println(translation[i]); 23 } 24 //输出内部类对象 25 System.out.println(basic.phonetic); 26 //输出内部类数组 27 for (int i = 0;i<basic.explains.length;i++){ 28 System.out.println(basic.explains[i]); 29 } 30 System.out.println(query); 31 System.out.println(errorCode); 32 for (int i = 0;i<web.size();i++){ 33 for(int j = 0; j<web.get(i).value.length;j++) 34 { 35 System.out.println(web.get(i).value[j]); 36 } 37 System.out.println(web.get(i).key); 38 } 39 } 40 }
7.JSON解析技术
7.1 FastJson框架技术
特点:Fastjson是用Java语言编写的高性能功能完善的JSON库。它采用了一种“假定有序、快速匹配”的算法,
把JSON Parse的性能提升到极致,是目前Java语言中最快的JSON库。
1.FastJson数度快,无论序列化和反序列化,都是当之无愧的fast
2.功能强大(支持普通JDK类包括任意Java Bean Class、Collection、Map、Date或enum)
3.零依赖(没有依赖其它任何类库)
Github地址:https://github.com/alibaba/fastjson
fastjson的API十分简洁
1 String text = JSON.toJSONString(obj); //序列化 2 VO vo = JSON.parseObject("{...}", VO.class); //反序列化
1 Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。 2 3 public static final Object parse(String text); // 把JSON文本parse为JSONObject或者JSONArray 4 *public static final JSONObject parseObject(String text); // 把JSON文本parse成JSONObject 5 *public static final T parseObject(String text, Class clazz); // 把JSON文本parse为JavaBean 6 *public static final JSONArray parseArray(String text); // 把JSON文本parse成JSONArray 7 *public static final List parseArray(String text, Class clazz); //把JSON文本parse成JavaBean集合 8 *public static final String toJSONString(Object object); // 将JavaBean序列化为JSON文本 9 public static final String toJSONString(Object object, boolean prettyFormat); // 将JavaBean序列化为带格式的JSON文本 10 public static final Object toJSON(Object javaObject); //将JavaBean转换为JSONObject或者JSONArray。 11 12 以上加*的是一些项目中的常用方法。
FastJson的简单说明: FastJson对于json格式字符串的解析主要用到了下面三个类: 1.JSON:fastJson的解析器,用于JSON格式字符串与JSON对象及javaBean之间的转换 2.JSONObject:fastJson提供的json对象 3.JSONArray:fastJson提供json数组对象
【步骤1】添加依赖
compile 'com.alibaba:fastjson:1.2.47' compile 'com.alibaba:fastjson:1.1.68.android'
【解析StringJson】
{ "studentName": "lily", "studentAge": 12 }
JSON解析
在了解了JSON后,是时候来看下如何在Android解析JSON数据
解析方法
Android解析JSON数据的方法和XML解析类似,主要有两种:
基于事件驱动和基于文档驱动解析方式
基于事件驱动
- 主流方式:Gson解析和Jackson解析
Gson介绍
- 简介:使用谷歌的开源库进行解析
- 解析方式:基于事件驱动,根据所需要取的数据通过建立一个对应于JSON数据的JavaBean类就可以通过简单的操作解析出所需JSON数据
Gson解析
步骤1:创建一个与JSON数据对应的JavaBean类(用作存储需要解析的数据)
GSON解析的关键是重点是要根据json数据里面的结构写出一个对应的javaBean,规则是:
1. JSON的大括号对应一个对象,对象里面有key和value(值)。在JavaBean里面的类属性要和key同名。
2. JSON的方括号对应一个数组,所以在JavaBeanBean里面对应的也是数组,数据里面可以有值或者对象。
3. 如果数组里面只有值没有key,就说明它只是一个纯数组,如果里面有值有key,则说明是对象数组。纯数组对应JavaBean里面的数组类型,对象数组要在Bean里面建立一个内部类,类属性就是对应的对象里面的key,建立了之后要创建一个这个内部类的对象,名字对应数组名。
4. 对象里面嵌套对象时候,也要建立一个内部类,和对象数组一样,这个内部类对象的名字就是父对象的key
注:JavaBean类里的属性不一定要全部和JSON数据里的所有key相同,可以按需取数据,也就是你想要哪种数据,就把对应的key属性写出来,注意名字一定要对应
以下有两个JSON文档来说明创建JavaBean类的创建方法
步骤1:复杂的JSON数据对应的JavaBean类
1 package scut.httpgson; 2 import java.util.List; 3 4 public class student { 5 public String[] translation; //["车"]数组 6 public basic basic; //basic对象里面嵌套着对象,创建一个basic内部类对象 7 public static class basic{ //建立内部类 8 public String phonetic; 9 public String[] explains; 10 } 11 public String query; 12 public int errorCode; 13 public List<wb> web; //web是一个对象数组,创建一个web内部类对象 14 public static class wb{ 15 public String[] value; 16 public String key; 17 } 18 19 public void show(){ 20 //输出数组 21 for (int i = 0;i<translation.length;i++) 22 { 23 System.out.println(translation[i]); 24 } 25 //输出内部类对象 26 System.out.println(basic.phonetic); 27 //输出内部类数组 28 for (int i = 0;i<basic.explains.length;i++){ 29 System.out.println(basic.explains[i]); 30 } 31 System.out.println(query); 32 System.out.println(errorCode); 33 for (int i = 0;i<web.size();i++){ 34 for(int j = 0; j<web.get(i).value.length;j++) 35 { 36 System.out.println(web.get(i).value[j]); 37 } 38 System.out.println(web.get(i).key); 39 } 40 } 41 }
好了,是不是觉得根据JSON文本数据去转换成JavaBean实体类很复杂呢?其实还有个简单的方法,请使用在线JSON字符串转Java实体类,哈哈请不要打我,继续往下看吧!
步骤2:下载并导入GSON需要的库
别FQ去谷歌官网下了,点这吧
步骤3:用Gson进行转换
1 package scut.learngson; 2 3 import android.os.Bundle; 4 import android.support.v7.app.AppCompatActivity; 5 import com.google.gson.Gson; 6 7 import org.json.JSONArray; 8 import org.json.JSONException; 9 import org.json.JSONObject; 10 11 import java.io.BufferedReader; 12 import java.io.IOException; 13 import java.io.InputStream; 14 import java.io.InputStreamReader; 15 16 public class MainActivity extends AppCompatActivity { 17 18 @Override 19 protected void onCreate(Bundle savedInstanceState) { 20 super.onCreate(savedInstanceState); 21 setContentView(R.layout.activity_main); 22 Gson gson = new Gson(); 23 //创建JavaBean类的对象 24 Student student = new EntityStudent(); 25 String json = "{\"id\":1,\"name\":\"小明\",\"sex\":\"男\",\"age\":18,\"height\":175}"; 26 //用GSON方法将JSON数据转为单个类实体 27 student = gson.fromJson(json,Student.class); 28 //调用student方法展示解析的数据 29 student.show(); 30 //将Java集合转换为json 31 String json2 = gson.toJson(List); System.out.println(json2); 32 } 33 }
总结
可以看到,利用GSON方法进行解析,关键在于根据json数据里面的结构写出一个对应的javaBean,而解析过程非常简单:
1 JavaBean对象 = gson.fromJson(son,javaBean类类名.class);
GSON、Jackson、Android Studio自带org.json解析三类方式对比
Android Studio自带org.json
- 原理:基于文档驱动
- 特点:
优点:无
缺点:解析 XML 文件时会将整个 XML 文件的内容解析成树型结构存放在内存中并创建新对象,比较消耗时间和内存,解析速度和效率慢,解析方式和性能完败GSON
GSON方式
- 原理:基于事件驱动
- 特点:
优点:解析方法简单、解析效率高、占存少、灵活性高
- 使用情境
适用于需要处理大型 JSON文档、JSON文档结构复杂的场合
Jackson方式
- 原理:基于事件驱动
- 特点:
优点:解析效率最高、在数据量大的情况优势尤为明显、占存少
缺点:必须完全解析文档,如果要按需解析的话可以拆分Json来读取,操作和解析方法复杂;
- 使用情境
适用于需要处理超大型JSON文档、不需要对JSON文档进行按需解析、、性能要求较高的场合
浙公网安备 33010602011771号