一、JSON简介:
JSON开发公司是一种轻量级的数据交换格式。它基于ECMAScript (European Computer),Manufacturers Association,开发公司欧洲计算机协会制定的js规范)开发公司的一个子集,开发公司采用完全独立于编程语开发公司言的文本格式来存储和表示数据。开发公司简洁和清晰的层次结构使得JSON开发公司成为理想的数据交换语言。开发公司易于人阅读和编写,开发公司同时也易于机器解析和生成,开发公司并有效地提升网络传输效率
{JSON}
二、JSON语法:
1.开发公司使用大括号保存对象,每个对象由若干数据组成。
2.每个数据由key:value速值对组成
3.数据之间使用逗号,分隔
4.使用\进行特殊字符的转义
大括号包含的是一个对象
{"key1":value1 , "key1 ":value1,……"key N":value N}
中括号包含的是一个数组(集合),里面可包含多个对象
1.
[{"key1":value1 , "key1":value1,…… "key N":value N},
{"key1":value1 , "key1" :value1.….… "key N":value N},
{"key1":value1 ," key1":value1,…."key N":value N}]
2.
{
"data":[{ "orderID":1001 , "userName": Bean " . "orderStatus":已支付,}
{ "orderlD":1005, "userName":肖战,… "orderStatus":已配送,}
{ "orderID":1041 , "userName":JayChou,…… "orderStatus":未出库}
]
}
三、JSON的用途:
在计算机系统之间进行数据传递
优点:1.只允许UTF-8编码,不存在编码问题
2.仅包含key-value键值对,不存在冗余,是一种轻量结构。
四、Java解析JSON
常用解析的的第三方库有:
Jackson
Gson
Fastjson
五、Fastjson
1.先导入jar包
jar包:
2.JSON类:主要用于原始转换
2.1
先准备一个类
- package com.yy.test;
-
- //派出所警局实体类
- public class PoliceStation {
-
- private String name; // 警局派出所的名称
- private String addr; // 地址
- private String tel; // 联系电话
-
-
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getAddr() {
- return addr;
- }
- public void setAddr(String addr) {
- this.addr = addr;
- }
- public String getTel() {
- return tel;
- }
- public void setTel(String tel) {
- this.tel = tel;
- }
- @Override
- public String toString() {
- return "PoliceStation [name=" + name + ", addr=" + addr + ", tel=" + tel + "]";
- }
-
-
- }
2.2 创建一个PoliceStation类的对象
- PoliceStation ps1 = new PoliceStation();
- ps1.setName("电子城派出所");
- ps1.setAddr("西安市地电子二路1005号");
- ps1.setTel("13772464337");
2.3 序列化:将Java对象转换成json字符串的数据
"{}"代表是一个对象JSONObject 继承自linkedhashSet;"[{}]"代表是一个集合(数组) 继承自ArrayList
- String json1 = JSON.toJSONString(ps1);
- System.out.println(json1);
2.4 反序列化:将json格式的字符串转换成Java对象
JSON字符串大致是此图结构
- String jsonStr = "{\"addr\":\"咸阳市渭城区文林路0525号\",\"name\":\"文林路派出所\",\"tel\":\"13309270719\"}";
- PoliceStation ps2 = JSON.parseObject(jsonStr,PoliceStation.class);
- System.out.println(ps2);
PoliceStation.class表示运用PoliceStation的输出格式来反序列化成一个PoliceStation对象
2.5 获取key为list的value值(集合 大概格式:[{}])
使用getJSONArray()方法获得一个集合数组
JSONArray jsonArray = jsonObj.getJSONArray("list");
2.6 遍历这个数组(此数组里面是一个个的对象,使用getJSONObject()方法可获得一个对象)
每个对象里面是字符串类型,所以用getString()方法获得。
- //方法1:遍历
- for(int i = 0;i < jsonArray.size();i++) {
- JSONObject item = jsonArray.getJSONObject(i);
- System.out.println("派出所的名称" + item.getString("name"));
- System.out.println("派出所的地址" + item.getString("addr"));
- System.out.println("派出所的电话" + item.getString("tel"));
-
- System.out.println();
- }
list本身就是一个集合,所以可以创建一个PoliceStation类的集合把list的数据添加进去。然后遍历它就可以得到。
- //方法2:
- List<PoliceStation> policeStationList = jsonObj.getList("list", PoliceStation.class);
- System.out.println("上海市目前" + policeStationList.size() + "个派出所");
- for(PoliceStation ps : policeStationList) {
- System.out.println(ps.getName());
- System.out.println(ps.getAddr());
- System.out.println(ps.getTel());
- }
六、常见问题
1.FastJson默认过滤null值,不显示null值字段。
- Map<String, Object> map = new HashMap<String, Object>(){
- {
- put("age", 18);
- put("name", "张三");
- put("sex", null);
- }
- };
-
- System.out.println(JSONObject.toJSONString(map));
输出结果
{"name":"张三","age":18}
【解决】转换成JSON字符串时,使用Feature枚举值进行设置
测试类:
- Map<String, Object> map = new HashMap<String, Object>(){
- {
- put("age", 18);
- put("name", "张三");
- put("sex", null);
- }
- };
- // 使用Feature类型的枚举值进行设置
- System.out.println(JSONObject.toJSONString(map,Feature.WriteMapNullValue));
2.控制JSON的字段顺序
实体类:
- public class PoliceStation {
- private String name;
- private String addr;
- private String tel;
-
-
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getAddr() {
- return addr;
- }
- public void setAddr(String addr) {
- this.addr = addr;
- }
- public String getTel() {
- return tel;
- }
- public void setTel(String tel) {
- this.tel = tel;
- }
- }
测试类:
- PoliceStation ps = new PoliceStation();
- ps.setName("电子城派出所");
- ps.setAddr("雁塔区电子二路343号");
- ps.setTel("13324554332");
-
- System.out.println(JSON.toJSONString(ps));
输出结果:
{"addr":"雁塔区电子二路343号","name":"电子城派出所","tel":"13324554332"}
【解决】:输出结果与字段定义顺序不一致,需要在定义实体类字段时,使用@JSONField注解ordinal属性进行顺序配置
- import com.alibaba.fastjson2.annotation.JSONField;
-
- public class PoliceStation {
- @JSONField(ordinal = 1)
- private String name;
-
- @JSONField(ordinal = 2)
- private String addr;
-
- @JSONField(ordinal = 3)
- private String tel;
- }
3.控制JSON 的Date字段格式。
实体类:
- // 订单类
- public class Order{
- // 订单编号
- private String orderId;
-
- // 创建日期
- private LocalDateTime creationTime;
-
- public Order() {
- this.orderId = UUID.randomUUID().toString();
- this.creationTime = LocalDateTime.now();
- }
-
- public String getOrderId() {
- return orderId;
- }
-
- public void setOrderId(String orderId) {
- this.orderId = orderId;
- }
-
- public LocalDateTime getCreationTime() {
- return creationTime;
- }
-
- public void setCreationTime(LocalDateTime creationTime) {
- this.creationTime = creationTime;
- }
- }
测试类
- public class Test {
- public static void main(String[] args) {
- Order order1 = new Order();
- String json = JSON.toJSONString(order1);
- System.out.println(json);
- }
- }
输出结果
{"creationTime":"2022-07-10 19:39:07.377","orderId":"dbee4f0c-ced7-463f-b19b-c83234cbd5b0"}
【解决】:输出日期字段时,默认格式不符合需求时,可以在定义实体类的Date字段,使用@JSONField注解的format属性进行格式配置。
- // 订单类
- public class Order{
- // 订单编号
- private String orderId;
-
- // 创建日期
- @JSONField(format = "yyyy-MM-dd HH:mm:ss")
- private LocalDateTime creationTime;
- }