0


JSON解析

一、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;
}
标签: java 后端 eclipse

本文转载自: https://blog.csdn.net/weixin_49187233/article/details/125825213
版权归原作者 无解的黑眼圈 所有, 如有侵权,请联系我们删除。

“JSON解析”的评论:

还没有评论