[小白]java之复杂JSON解析【超详细】
本文介绍了两种解析复杂JSON数据的方法:1. 基于类实现,通过创建与JSON结构对应的Java类,使用Hutool工具的JSONUtil.toBean()方法将JSON字符串转换为对象;2. 通过Map实现,将JSON解析为Map结构进行灵活处理。文章以实际开发案例展示了如何解析包含嵌套对象、数组等复杂结构的JSON数据,并保存到数据库。重点说明了字段对应关系和类型转换的关键点,推荐使用Huto
·
前言
今天在开发的时候接到了一个这个样的需求,说是要将一个json文件读取下来之后,保存到数据库中,还有各种关联表之间的关系,不管是JsonObject JsonArray JsongString Json对象转实体类 等 统统拿下,全部解析。
依赖
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.11</version> <!-- 请使用最新版本 -->
</dependency>
复杂的JSON
{
"classifys": [
"社会"
],
"createTime": 1736794990493,
"directions": [
"东海"
],
"documentType": 0,
"entities": [
{
"frequency": 8,
"type": 1020,
"typeName": "国家",
"word": "2dq"
},
{
"frequency": 4,
"type": 1003,
"typeName": "机构",
"word": "dq象厅"
},
{
"frequency": 2,
"type": 1026,
"typeName": "eqw语",
"word": "警告"
},
{
"frequency": 2,
"type": 1026,
"typeName": "ewq术语",
"word": "太平洋"
},
{
"frequency": 1,
"type": 1003,
"typeName": "机构",
"word": "切尔诺eqw核电站"
},
{
"frequency": 1,
"type": 1026,
"typeName": "eqw术语",
"word": "活动"
},
{
"frequency": 1,
"type": 2001,
"typeName": "时间",
"word": "2011年3月"
},
{
"frequency": 1,
"type": 2001,
"typeName": "时间",
"word": "2011年"
},
{
"frequency": 1,
"type": 1002,
"typeName": "地点",
"word": "南开"
},
{
"frequency": 1,
"type": 1026,
"typeName": "军13语",
"word": "一种"
},
{
"frequency": 1,
"type": 1026,
"typeName": "21术语",
"word": "美国地质调查局"
},
{
"frequency": 1,
"type": 1026,
"typeName": "3语",
"word": "下午"
},
{
"frequency": 1,
"type": 2001,
"typeName": "时间",
"word": "21:19"
},
{
"frequency": 1,
"type": 2001,
"typeName": "时间",
"word": "今天"
},
{
"frequency": 1,
"type": 1002,
"typeName": "地点",
"word": "东京"
},
{
"frequency": 1,
"type": 1021,
"typeName": "重点目标",
"word": "港口"
}
],
"entity": [
"切尔诺贝利核电站",
"活动",
"2011年3月",
"2011年",
"南开",
],
"id": "6785631c2c220462abd2a96a",
"imgList": [
"67aebe005263920a9cfd58ac.jpg"
],
"keywords": [
"造成x损失",
"人xx",
"区",
],
"lables": [
"xx",
"地球",
],
"publishTime": 1736697600000,
"synopsis": "周一晚些时候,",
"territorys": [
"16"
],
"traceSource": [
{
"docId": "6785631c2c220462abd2a96a",
"eventDate": 1736697600000,
"eventDateStr": "2025.01.13",
"eventInfo": "气象厅警告称"
},
{
"docId": "6785631c2c220462abd2a96a",
"eventDate": 1736697600000,
"eventDateStr": "2025.01.13",
"eventInfo": "日本"
},
{
"docId": "6785631c2c220462abd2a96a",
"eventDate": 1736697600000,
"eventDateStr": "2025.01.13",
"eventInfo": "西南部发生6.8级地震"
},
{
"docId": "6785631c2c220462abd2a96a",
"eventDate": 1736697600000,
"eventDateStr": "2025.01.13",
"eventInfo": "西南部引发两次小海啸"
},
{
"docId": "6785631c2c220462abd2a96a",
"eventDate": 1704038400000,
"eventDateStr": "2024",
"eventInfo": "发生7.5级地震"
},
{
"docId": "6785631c2c220462abd2a96a",
"eventDate": 1646064000000,
"eventDateStr": "2022.03",
"eventInfo": "东部大片地区"
},
{
"docId": "6785631c2c220462abd2a96a",
"eventDate": 1646064000000,
"eventDateStr": "2022.03",
"eventInfo": "福岛地震"
},
{
"docId": "6785631c2c220462abd2a96a",
"eventDate": 1298908800000,
"eventDateStr": "2011.03",
"eventInfo": "东北部大地震"
},
{
"docId": "6785631c2c220462abd2a96a",
"eventDate": 1298908800000,
"eventDateStr": "2011.03",
"eventInfo": "日啸"
},
{
"docId": "6785631c2c220462abd2a96a",
"eventDate": -1483257600000,
"eventDateStr": "1923",
"eventInfo": "摧毁一场大地震"
}
],
}
可以看到,上述JSON中 什么都包含了,json对象 json数组 json集合 等等 ,那么如何将复杂的json字符串解析成自己想要的呢? 接着往再看
方式一:基于类实现
创建类
其实我们只需要创建基于上述json的类即可 下面是我简单的创建了一个类然后该类里面的字段和json的key对应.
注意:
1.只有和json中的字段对应才会被解析。
基础数据类
package com.ruoyi.system.domain.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
/**
* 互联网采集数据(NetworkData)实体类
*
* @author makejava
* @since 2025-01-21 17:16:04
*/
@ApiModel(value = "互联网采集数据(NetworkData)实体类")
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@TableName(value = "network_data")
public class NetworkData implements Serializable {
private static final long serialVersionUID = 786479205391408738L;
@TableId(value = "network_id", type = IdType.AUTO)
@ApiModelProperty(value = "network_id")
private Integer networkId;
private String createTime;
private String entity;
private String originalTitle;
private String classifys;
private List<Entities> entities;
}
Entities类
package com.ruoyi.system.domain.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Entities implements Serializable {
private String frequency;
private String type;
private String typeName;
private String word;
}
解析
通过上述我们创建好了类型之后,可以使用hutool中的JSONUtil.toBean(String s,T.class)方法解析jsonString
如:在我真实开发中使用到
private void jsonTOSql2(String s, String fileName, String dateString) {
/*
* 使用hutool的toBean转换
*/
MainTable mainTable = JSONUtil.toBean(s, MainTable.class);
// insertSql(mainTable);
NetworkData networkData = new NetworkData();
AutonomouMessage autonomouMessage = new AutonomouMessage();
//类型
autonomouMessage.setFileType(1);
//原文地址
autonomouMessage.setOriginalUrl(mainTable.getUrl());
//原文标题
autonomouMessage.setMessageTitle(mainTable.getSourceTitle());
}
方式二:通过map实现
下述是一个简单的实例
示例一
private void jsonTOMap() {
String mixedJson = "{\"name\":\"混合类型\",\"scores\":[85,90,95],\"info\":{\"married\":true}}";
Map<String, Object> map = JSONUtil.parseObj(mixedJson).toBean(Map.class);
// 访问数组
List<Integer> scores = (List<Integer>)map.get("scores");
System.out.println("分数: " + scores); // [85, 90, 95]
// 访问布尔值
Boolean married = (Boolean)((Map)map.get("info")).get("married");
System.out.println("已婚: " + married); // true
}
示例二
private void jsonTOMap2() {
String jsonArrayStr = "[{\"name\":\"产品A\",\"price\":99.0},{\"name\":\"产品B\",\"price\":199.0}]";
// 转换为List<Map>
List<Map<String, Object>> list = JSONUtil.parseArray(jsonArrayStr).toList(Map.class);
// 遍历
for (Map<String, Object> item : list) {
System.out.println("产品: " + item.get("name") + ", 价格: " + item.get("price"));
}
}
结尾
话不多少,只讲实操案例,如果想要更多json之间的转换可以去Hutool网站去查看!
更多推荐
所有评论(0)