Java如何快速读取&解析JSON数据(文件),获取想要的内容?
手打不易,如果转摘,请注明出处!
注明原文: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数据(示例)
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 } ] }
解析Json文件
第一步:创建一个空类
public class MyJsonObject { }
第二步:使用 Gsonformat 插件
空白处点击右键,选择 Generator ,然后选择
第三步:复制Json内容,创建对应类
注意:我们不需要把整个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; } } } }
第四步:读取Json文件,提取目标数据
假设我们想知道每个学校,有哪些学生(姓名)。
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文件,快速获取我们想要的内容!
如果文件特别大,可以考虑多线程的方式处理。
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。