一、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包:http://链接:https://pan.baidu.com/s/1tSwEpej7_9e-Mf6QtKgnCw 提取码:tqug
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;
}
版权归原作者 无解的黑眼圈 所有, 如有侵权,请联系我们删除。