快速预览
- 1. 什么是fastjson
- 2. 什么是JSON
- 如何使用
- 3.1 创建demo
- 3.2 将javaBean转化为JSON字符串
- 3.3 将JSON字符串转化为JavaBean
- 3.4 将JavaBean转化为JSON对象
- 3.5 将JSON对象转化为JavaBean
- 3.6 将JavaBean集合转化为JsonArray
- 3.7 将JSONArray转化为JavaBean集合
- 3.8 将JSON对象转化为JSON字符串
- 3.9 将JSON字符串转化为JSON对象
- 3.10 将JSON字符串转化为JSONArray的形式。
1. 什么是fastjson
fastjson是阿里巴巴推出的一款开源的Json处理器,也是目前比较流行的Json解析器和生成器。
它可以将任何java对象转化为Json,也可以将Json转化为Java对象。
fastjson广泛流行最大的原因就是其优越的性能表现。至今为止,没有一款Json处理工具在性能方面超过fastjson。fastjson支持java和Android两个开发语言。
2. 什么是JSON
在继续了解fastjson之前,要先对json进行了解。如果您想继续了解fastjson的用法:fastjson如何使用
JSON全拼为 JavaScript Object Notation :JavaScript对象表示法。
JavaScript是什么?用来操控Html元素,在Web页面上与用户进行交互的。JSON并不是JS的一种对象,而是用来展示对象信息的一种格式。JSON本质上是一个串字符。
JSON的表现形式如下:
{"name":"张三", "age":23, "gender":"男"};
- 1
熟悉Map的朋友应该肯容易看出来这种 key - value 的数据结构。
以上面这段JSON代码为例,上面这一条JSON对象包含三个数据,分别是:
key(键) | value(值) |
---|---|
name | 张三 |
age | 23 |
gender | 男 |
JSON既然是一种数据格式,那么肯定有其特有的语法规则,其规则如下:
-
JSON对象由花括号{}来保存。
-
key(键)就是数据名称,通过键来拿去数据中的值。键需要用引号引起来,单双引号都可以,当然,也可以不写引号,不过为了便于和值区分,最好加上。
-
值就是普通的数据类型了。它支持以下数据类型:
-
数字(整数或浮点数)
-
字符串("")
-
逻辑值(true or false)
-
数组(方括号)
[ {"key", "value"}, {"key2", true} ]
- 1
- 2
- 3
- 4
-
对象(花括号)
{'name':"李四", 'gender':0}
- 1
-
null
数组和对象是可以相互嵌套的:
{ 'person':[ {'name':"张三", 'age':22}, {'name':"李四", 'age':23} ], 'class':[ {'name':"化工本一", 'id':0901}, {'name':"英语本一", 'id':1201} ] }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
-
如何使用
这里我们将通过一个demo来了解fastjson的功能和用法。在此之前,我们先来了解一下fastjson的一个常用注解:
@JSONField(属性 = “xxx”, …),用在字段上。
属性 | 作用 |
---|---|
name | Json中的key(键) |
ordinal | 按照值的从小到大顺序来输出java对象的字段内容 |
format | 用在date上, 按照定义的类型显示时间 |
serialize | 是否序列化(将java对象转化为字节类型的过程) |
deserialize | 是否反序列化(将字节类型转化为java对象的过程) |
在日常工作中,我们会用到@JSONField()注解来对字段进行修饰,得到想要的结果。
接下来,将通过demo来了解fastjson的用法。
3.1 创建demo
这里我们首先要在maven中导入maven依赖:
<dependency>
<groupId></groupId>
<artifactId>fastjson</artifactId>
<version></version>
</dependency>
- 1
- 2
- 3
- 4
- 5
接下来创建一个用户类:
@Data
@AllArgsConstructor()
@NoArgsConstructor()
public class User {
@JSONField(name = "姓名", ordinal = 1, serialize = false)
private String name;
@JSONField(name = "性别", ordinal = 2)
private Integer gender;
@JSONField(name = "邮箱", ordinal = 3)
private String email;
//无参构造和有参构造以及get/set方法通过Lombok创建
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
接下来,创建测试类:
@Test
void testToString() throws JSONException {
List<User> users = new ArrayList<>();
User user1 = new User("张三", 1, "123@");
User user2 = new User("王五", 1, "233@");
users.add(user1);
users.add(user2);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
3.2 将javaBean转化为JSON字符串
首先将上面的User类转化为Json字符串。
//(Object)
String jsonString = JSON.toJSONString(user1);
System.out.println(jsonString);
- 1
- 2
- 3
运行查看输出结果:
{"性别":1,"邮箱":"123@"}
- 1
可以看到,不允许序列化的name字段,并没有在json字符串中显示出来,也就是说,fastjson没有解析该字段,只对其他字段进行了转化。
为了方便后面的操作,我们将User类中name字段的序列化设置为true(默认即为true,因此可以不写).
@JSONField(name = "名字", ordinal = 1, serialize = true)
private String name;
- 1
- 2
再次运行查看输出结果:
{"名字":"张三","性别":1,"邮箱":"123@"}
- 1
可以发现User类中的name字段又被解析出来了。
3.3 将JSON字符串转化为JavaBean
//(JSONString, Class<Object>)
User stringToBean = JSON.parseObject(beanToString, User.class);
System.out.println(stringToBean);
System.out.println(user1);
- 1
- 2
- 3
- 4
运行查看输出结果:
User(name=张三, gender=1, email=123@123.com)
User(name=张三, gender=1, email=123@123.com)
- 1
- 2
可以发现转化后的对象和User1一致。
3.4 将JavaBean转化为JSON对象
//(Object)
JSONObject beanToObj = (JSONObject) JSON.toJSON(user2);
System.out.println(beanToObj.getString("名字"));
System.out.println(beanToObj);
- 1
- 2
- 3
- 4
运行程序查看输出结果:
王五
{"名字":"王五","邮箱":"233@","性别":1}
- 1
- 2
可以发现原来的JavaBean对象被转化为了JSON对象。
至于代码中为什么要强转JSONObject,是因为toJSON()方法的返回值为Object,在其内部对方法传入的对象进行了类型判断,我们找到JavaBean的判断方法:
ObjectSerializer serializer = config.getObjectWriter(clazz);
if (serializer instanceof JavaBeanSerializer) {
JavaBeanSerializer javaBeanSerializer = (JavaBeanSerializer) serializer;
JSONObject json = new JSONObject();
try {
Map<String, Object> values = javaBeanSerializer.getFieldValuesMap(javaObject);
for (Map.Entry<String, Object> entry : values.entrySet()) {
json.put(entry.getKey(), toJSON(entry.getValue(), config));
}
} catch (Exception e) {
throw new JSONException("toJSON error", e);
}
return json;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
可以发现其返回的是一个JSONObject对象。
JSONObject是Object的子类,也就是说父类Object可以接收JSONObject中的属性,但额外的子类方法在Object中是没办法使用的。
那么此时就可以用到父类强转了,将Object强转为JSONObject类,从而调用JSONObject中的方法,实现功能。
3.5 将JSON对象转化为JavaBean
//(JSONObject, Class<Object>)
User objToBean = JSON.toJavaObject(beanToObj, User.class);
System.out.println(objToBean);
- 1
- 2
- 3
运行程序查看结果:
User(name=王五, gender=1, email=233@233.com)
- 1
3.6 将JavaBean集合转化为JsonArray
// (Object)
JSONArray listBeanToJsonArray = (JSONArray) JSON.toJSON(users);
listBeanToJsonArray.forEach(System.out::println);
- 1
- 2
- 3
运行查看结果:
{"名字":"张三","邮箱":"123@","性别":1}
{"名字":"王五","邮箱":"233@","性别":1}
- 1
- 2
这里也是调用了toJSON方法,在判断条件中,返回了一个JSONArray集合,同样的整个方法返回值也是Object。然而Java不能自动将Object(上层)转化为JSONArray(下层),所以,我们需要手动添加强转。
3.7 将JSONArray转化为JavaBean集合
//这里通过forEach循环遍历Json集合,然后将Json对象转化为JavaBean对象,最终将Java对象添加到Java集合中
List<User> listJsonArrayToBean = new ArrayList<>();
listBeanToJsonArray.forEach( json -> {
User user = JSON.toJavaObject((JSON) json, User.class);
listJsonArrayToBean.add(user);
});
listJsonArrayToBean.forEach(System.out::println);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
运行查看结果:
User(name=张三, gender=1, email=123@123.com)
User(name=王五, gender=1, email=233@233.com)
- 1
- 2
3.8 将JSON对象转化为JSON字符串
//(JSONObject)
String objToString = JSONObject.toJSONString(beanToObj);
System.out.println(objToString);
- 1
- 2
- 3
运行查看结果:
{"名字":"王五","邮箱":"233@","性别":1}
- 1
3.9 将JSON字符串转化为JSON对象
//(JSONString)
JSONObject stringToObj = JSON.parseObject(objToString);
System.out.println(stringToObj.getString("邮箱"));
- 1
- 2
- 3
运行查看结果:
233@233.com
- 1
3.10 将JSON字符串转化为JSONArray的形式。
//(JSONString)
JSONArray stringToJsonArray = JSON.parseArray(JSON.toJSONString(users));
stringToJsonArray.forEach(System.out::println);
- 1
- 2
- 3
运行查看结果:
{"名字":"张三","邮箱":"123@","性别":1}
{"名字":"王五","邮箱":"233@","性别":1}
- 1
- 2