手打不易,如果转摘,请注明出处!
注明原文:https://zhangxiaofan.blog.csdn.net/article/details/132764186
目录
前言
准备工作
Json数据(示例)
解析Json文件
第一步:创建一个空类
第二步:使用 Gsonformat 插件
第三步:复制Json内容,创建对应类
第四步:读取Json文件,提取目标数据
总结
工作做,有时候会碰到一些复杂的Json格式数据(复杂的数据一般都是json.file文件),大部分字段可能对我们没有用,因此我们需要去主动格式化,只提取或者过滤我们想要的数据。
开发工具:intellij idea
插件:Gsonformat
下载地址如下:
Gsonformat - IntelliJ IDEs Plugin | Marketplace
直接在idea,通过 Plugins 安装即可。
maven 依赖:
commons-io
commons-io
2.11.0
Json文件数据示例:
文件路径:
src/main/resources/jsonfile/test.json
文件名: test.json
文件内容:
{
"code": 200,
"msg": "成功",
"data": [
{
"id": 1,
"version": "2",
"schoolList": [
{
"id": 1,
"name": "岭南一中",
"studentList": [
{
"name": "zhangxiaofan",
"age": 15
},
{
"name": "wangwu",
"age": 16
}
]
},
{
"id": 2,
"name": "实验中学",
"studentList": [
{
"name": "lisi",
"age": 16
},
{
"name": "zhaoliu",
"age": 15
}
]
}
],
"flag": true
}
]
}
public class MyJsonObject {
}
空白处点击右键,选择 Generator ,然后选择
注意:我们不需要把整个Json内容复制进去,数据量很大的情况下,会卡死。
例如:我们要解析的Json格式含有很多List对象,那么我们只需拷贝List中的一个单元数据(Object)即可,因为格式是固定的。例如我们只需拷贝下面的内容来创建bean就行。
{
"code": 200,
"msg": "成功",
"data": [{
"id": 1,
"version": "2",
"schoolList": [{
"id": 1,
"name": "岭南一中",
"studentList": [{
"name": "zhangxiaofan",
"age": 15
}]
}],
"flag": true
}]
}
点击确定后,会自动帮我们创建好对应的POJO类
@NoArgsConstructor
@Data
public class MyJsonObject {
/**
* code : 200
* msg : 成功
* data : [{"id":1,"version":"2","schoolList":[{"id":1,"name":"岭南一中","studentList":[{"name":"zhangxiaofan","age":15}]}],"flag":true}]
*/
private int code;
private String msg;
private List data;
@NoArgsConstructor
@Data
public static class DataBean {
/**
* id : 1
* version : 2
* schoolList : [{"id":1,"name":"岭南一中","studentList":[{"name":"zhangxiaofan","age":15}]}]
* flag : true
*/
private int id;
private String version;
private boolean flag;
private List schoolList;
@NoArgsConstructor
@Data
public static class SchoolListBean {
/**
* id : 1
* name : 岭南一中
* studentList : [{"name":"zhangxiaofan","age":15}]
*/
private int id;
private String name;
private List studentList;
@NoArgsConstructor
@Data
public static class StudentListBean {
/**
* name : zhangxiaofan
* age : 15
*/
private String name;
private int age;
}
}
}
}
假设我们想知道每个学校,有哪些学生(姓名)。
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class Test {
public static final String JSON_PATH = "E:\\JavaProject\\local\\JavaCoreTest\\src\\main\\resources\\jsonfile\\test.json";
public static void main(String[] args) throws IOException {
Set url = new HashSet<>();
List urlArray = new ArrayList<>();
File file = new File(JSON_PATH);
String content = FileUtils.readFileToString(file, "UTF-8");
MyJsonObject myJsonObject = JSONObject.parseObject(content, MyJsonObject.class);
// 数据
List data = myJsonObject.getData();
for (MyJsonObject.DataBean dataBean : data) {
for (MyJsonObject.DataBean.SchoolListBean school : dataBean.getSchoolList()) {
// 学校名
String schoolName = school.getName();
for (MyJsonObject.DataBean.SchoolListBean.StudentListBean student : school.getStudentList()) {
// 学生姓名
String studentName = student.getName();
System.out.println("学校:" + schoolName + ",有学生:" + studentName);
}
}
}
}
}
执行结果:
Connected to the target VM, address: '127.0.0.1:35240', transport: 'socket'
学校:岭南一中,有学生:zhangxiaofan
学校:岭南一中,有学生:wangwu
学校:实验中学,有学生:lisi
学校:实验中学,有学生:zhaoliu
按照上面的方法,我们可以快速的提取复杂的Json文件,快速获取我们想要的内容!
如果文件特别大,可以考虑多线程的方式处理。