前言

        今天在开发的时候接到了一个这个样的需求,说是要将一个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网站去查看!

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐