JSON解析:FastJson和Gson工具的使用
JSON
1. JSON简介
- JAVAScript Object Notation是一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。
- JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为。 – Json.org
- JSON是目前网络中主流的数据传输格式之一,应用十分广泛。
2. JSON支持的数据类型
JSON里面的数据是以一种键值对的方式存在,( " key " : " value " )中值的类型可以是下面数据类型中的任意一种:
- 数字(整数或浮点数)
- 逻辑值(true 或 false)
- 字符串(在双引号中)
- 数组(在方括号中)
- 函数
- 对象(在大括号中)
- null
3. JSON语法格式
- 键与值之间使用冒号连接, 多个键值对之间使用逗号分隔。
- 键值对的键应使用引号引住 (通常Java解析时,键不使用引号会报错,而JS能正确解析)
- 键值对的值,可以是JS中的任意类型的数据。
JSON解析中的三种类型情况:
- {}解析 ’ 大括号 ’ 类型,例如:
String jsonObj = "{
"name": "小明",
"sex": "男",
"age": 20,
"phone": "18695124231"
}";
- [ ] 解析 ’ 中括号 ’ 类型,例如:
- Array(数组类型):使用[ ]包含所有元素,每个元素用逗号分隔,元素可以是任意的值
String jsonArr = "["小明", "男", 20, "18695124231"]";
- 第三种是1与2的组合方法例如:
String jsonObj = "{
"sxe":"男",
"name":"翟大刚",
"age":24,
"new":["芜湖风","男",28]
}";
JSON常用解析工具
Gson和Fastjson的区别
- Gson的优势是转换复杂对象,性能消耗比FastJson大;
- 而FastJson优势是解析转换复杂对象的速度最快,但是对一些复杂转换就会出现问题。
在开发中,如果性能满足的情况下,推荐使用Gson。因为对于复杂类型,比如原子类如:AtomicLong属性,fastjson会按照基本类型解析,而不是对象。这样会导致反序列化的时候数据不完整,所以,强烈建议Gson。
1. Gson
1.1 简介
- Gson是目前功能最全的Json解析神器。
- Gson的应用主要为:toJson与fromJson两个转换函数,无依赖,不需要额外的jar,能够直接跑在JDK上。
- 类里面只要有get和set方法,Gson可以将复杂类型的json完美转换到bean,以及bean完美转换到json。
- 在使用这种对象转换之前,需要先创建好对象的类型以及其成员,才能成功的将JSON字符串成功转换成相对应的对象。
1.2 添加依赖
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.6</version>
</dependency>
1.3 测试对象Student类
public class Student {
private String name;
private String sex;
private int age;
public Student(String name, String sex, int age) {
this.name = name;
this.sex = sex;
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age &&
Objects.equals(name, student.name) &&
Objects.equals(sex, student.sex);
}
@Override
public int hashCode() {
return Objects.hash(name, sex, age);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Student() {
}
}
1.4 bean转换json:toJson
转换JSON字符串的步骤:
- 引入JAR包
- 在需要转换JSON字符串的位置编写如下代码即可:
String json = new Gson().toJSON(要转换的对象);
代码示例:
public static void main(String[] args) {
//创建Gson对象
Gson gson = new Gson();
//创建学生类
Student student = new Student("刘虎","男",20);
//将对象转换为JSON字符串
String s = gson.toJson(student);
System.out.println(s);
}
运行结果:
{"name":"刘虎","sex":"男","age":20}
1.5 json转换bean:fromJson
步骤:
- 引入JAR包
- 在需要转换Java对象的位置, 编写如下代码:
对象 = new Gson().fromJson(JSON字符串,对象类型.class);
代码示例:
public static void main(String[] args) {
//创建Gson对象
Gson gson = new Gson();
Student student1 = gson.fromJson("{\"name\":\"刘虎\",\"sex\":\"男\",\"age\":20}", Student.class);
System.out.println(student1);
}
运行结果:
Student{name='刘虎', sex='男', age=20}
1.6 将json转换成复杂类型的bean
public static void main(String[] args) {
//创建Gson对象
Gson gson = new Gson();
//将Json格式文件转换成HashMap
HashMap hashMap = gson.fromJson("{\"name\":\"刘虎\",\"sex\":\"男\",\"age\":20}", HashMap.class);
System.out.println(hashMap.get("name") + "," + hashMap.get("sex") + "," + hashMap.get("age"));
// 将json转换成List
String json = "[{\"id\":\"1\",\"name\":\"Json技术\"},{\"id\":\"2\",\"name\":\"java技术\"}]";
// 将json转换成List
List list = gson.fromJson(json, List.class);
System.out.println(list.get(0));
}
2. FastJson
2.1 简介
- FastJson由阿里使用Java开发的高性能的JSON处理器,无依赖,不需要额外的jar,能够直接跑在JDK上。
- FastJson在复杂类型的Bean转换Json上会出现一些问题,可能会出现引用的类型无法解析,导致Json转换出错,需要制定引用。
- FastJson采用独创的算法,将parse的速度提升到极致,超过所有json库。
2.2 依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.75</version>
</dependency>
2.3 bean转换json: toJSONString
转换JSON字符串的步骤:
- 引入JAR包
- 在需要转换JSON字符串的位置编写如下代码即可:
String json=JSON.toJSONString(要转换的对象);
代码示例:
public static void main(String[] args) {
Student student = new Student("翟大刚","男",24);
Object o = JSON.toJSONString(student);
System.out.println(o.toString());
}
运行结果:
{"age":24,"name":"翟大刚","sex":"男"}
2.4 json转换bean:parseObject
步骤:
- 引入JAR包
- 在需要转换Java对象的位置, 编写如下代码:
类型 对象名 = JSON.parseObject( JSON字符串 , 类型.class );
或
List<类型> list = JSON.parseArray( JSON字符串 , 类型.class );
代码示例:
public static void main(String[] args) {
Student student = new Student("翟大刚","男",24);
Object o = JSON.toJSONString(student);
System.out.println(o.toString());
}
复杂类型:将json转换成List,Set,Array
public static void main(String[] args) {
//将json转换成Array
String jsonArr = "[ \"小明\",\"男\",\"学生\",25 ]";
JSONArray objects = JSON.parseArray(jsonArr);
System.out.println(objects);
String json = "[{\"id\":\"1\",\"name\":\"Json技术\"},{\"id\":\"2\",\"name\":\"java技术\"}]";
// 将json转换成List
List list = JSON.parseObject(json, List.class);
System.out.println(list.get(0));
//将json转换成Set
Set set = JSON.parseObject(json, Set.class);
System.out.println(set.toString());
}
运行结果:
["小明","男","学生",25]
{"name":"Json技术","id":"1"}
[{"name":"java技术","id":"2"}, {"name":"Json技术","id":"1"}]
3.如何选择Gson和FastJson
在项目选型的时候可以使用Google的Gson和阿里巴巴的FastJson两种并行使用,
- 如果只是功能要求,没有性能要求,可以使用google的Gson。
- 如果有性能上面的要求,可以使用Gson将bean转换json确保数据的正确,使用FastJson将Json转换Bean。