当前位置: 首页 > news >正文

JSON 提取器:从文本中提取 JSON 内容的实用工具

JSON 提取器:从文本中提取 JSON 内容的实用工具

文章目录

  • JSON 提取器:从文本中提取 JSON 内容的实用工具
    • 需自行引入 hutool
    • 完整代码
    • 引言
    • 代码解析
      • 主方法
      • 判断 JSON 格式
      • 提取 JSON 数据
    • 结论

在现代软件开发中,JSON(JavaScript Object Notation)是一种广泛使用的数据交换格式。无论是前端与后端的通信,还是配置文件的存储,JSON 都扮演着重要的角色。有时,我们需要从文本中提取 JSON 格式的数据,而这可能并不像看上去那么简单。今天,我将分享一个简单而有效的 Java 工具类 JsonExtractor,它可以帮助我们从文本中提取 JSON 格式的内容。

需自行引入 hutool

HuTool:https://www.hutool.cn/

        <!-- HuTool:https://www.hutool.cn/ --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version></dependency>

完整代码

package cn.com.mfish.web.main;import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONException;
import cn.hutool.json.JSONObject;
import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** JSON 提取器** @author zibo* @date 2024/8/10 下午10:13* @slogan 慢慢学,不要停。*/
public class JsonExtractor {// json 正则表达式private static final String JSON_PATTERN = "\\s*(\\{.*?\\}|\\[.*?\\])\\s*";private JsonExtractor() {throw new IllegalStateException("Utility class");}public static void main(String[] args) {String inputText = """当然!以下是一个简单的 JSON 示例,其中包含一层嵌套结构:```json{"name": "Alice","age": 30,"email": "alice@example.com","address": {"street": "123 Main St","city": "Wonderland","postalCode": "12345"}}```在这个示例中,`address` 是嵌套的 JSON 对象,包含了 `street`、`city` 和 `postalCode` 这几个属性。""";String json = extractJson(inputText);System.out.println(json);}/*** 判断字符串是否是 JSON 格式** @param jsonString JSON 字符串* @return true 如果字符串是 JSON 格式,否则 false*/private static boolean isJson(String jsonString) {if (jsonString == null || jsonString.trim().isEmpty()) {return false;}try {// 尝试解析为 JSON 对象new JSONObject(jsonString);return true;} catch (JSONException e) {// 尝试解析为 JSON 数组try {new JSONArray(jsonString);return true;} catch (JSONException ex) {return false;}}}/*** 判断字符串中是否包含 JSON 格式的内容(markdown语法)** @param text 输入文本* @return true 如果文本中包含 JSON 格式的内容,否则 false*/private static boolean containsMdJson(String text) {return text.contains("```json");}/*** 从文本中提取 JSON 格式的内容** @param text 输入文本* @return JSON 格式的内容*/public static String extractJson(String text) {// 先判断其本身是否是 JSON 格式的字符串if (isJson(text)) {return text;}// 先判断字符串中是否包含 JSON 格式的内容(markdown语法)if (containsMdJson(text)) {// 提取 JSON 格式的内容String jsonStart = "```json";String jsonEnd = "```";int startIndex = text.indexOf(jsonStart) + jsonStart.length();int endIndex = text.indexOf(jsonEnd, startIndex);// 提取 JSON 格式的内容String json = text.substring(startIndex, endIndex).trim();// 判断提取的内容是否是 JSON 格式if (isJson(json)) {return json;}}// 再判断其是否包含 JSON 格式的内容// 提取 JSON 格式的内容Pattern pattern = Pattern.compile(JSON_PATTERN, Pattern.DOTALL);Matcher matcher = pattern.matcher(text);if (matcher.find()) {return matcher.group(1);}// 如果没有 JSON 格式的内容,则返回 nullreturn null;}
}

引言

在这篇博客中,我们将深入探讨如何使用正则表达式和简单的字符串操作,从复杂的文本中提取出 JSON 数据。我们将使用 cn.hutool.json 库来处理 JSON 数据格式的验证。

代码解析

首先,我们定义了一个 JsonExtractor 类,这是一个实用工具类,因此构造函数是私有的,防止实例化。

public class JsonExtractor {private static final String JSON_PATTERN = "\\s*(\\{.*?\\}|\\[.*?\\])\\s*";private JsonExtractor() {throw new IllegalStateException("Utility class");}...
}

主方法

main 方法是程序的入口,用于测试我们的 JSON 提取功能。我们提供了一段包含 JSON 数据的文本,并调用 extractJson 方法来提取其中的 JSON 数据。

public static void main(String[] args) {String inputText = """当然!以下是一个简单的 JSON 示例,其中包含一层嵌套结构:```json{"name": "Alice","age": 30,"email": "alice@example.com","address": {"street": "123 Main St","city": "Wonderland","postalCode": "12345"}}```在这个示例中,`address` 是嵌套的 JSON 对象,包含了 `street`、`city` 和 `postalCode` 这几个属性。""";String json = extractJson(inputText);System.out.println(json);
}

判断 JSON 格式

isJson 方法用于判断给定的字符串是否为有效的 JSON 格式。我们尝试将字符串解析为 JSONObjectJSONArray,如果成功,则返回 true

private static boolean isJson(String jsonString) {if (jsonString == null || jsonString.trim().isEmpty()) {return false;}try {new JSONObject(jsonString);return true;} catch (JSONException e) {try {new JSONArray(jsonString);return true;} catch (JSONException ex) {return false;}}
}

提取 JSON 数据

extractJson 方法是核心逻辑,它从输入文本中提取 JSON 数据。首先,它判断文本本身是否为 JSON 格式,然后检查是否包含 Markdown 格式的 JSON 数据块,最后使用正则表达式进行匹配。

public static String extractJson(String text) {if (isJson(text)) {return text;}if (containsMdJson(text)) {String jsonStart = "```json";String jsonEnd = "```";int startIndex = text.indexOf(jsonStart) + jsonStart.length();int endIndex = text.indexOf(jsonEnd, startIndex);String json = text.substring(startIndex, endIndex).trim();if (isJson(json)) {return json;}}Pattern pattern = Pattern.compile(JSON_PATTERN, Pattern.DOTALL);Matcher matcher = pattern.matcher(text);if (matcher.find()) {return matcher.group(1);}return null;
}

结论

通过这篇博客,我们了解了如何在 Java 中使用正则表达式和字符串操作来提取 JSON 数据。这种方法尤其适合用于分析日志文件、配置文件或文档中的 JSON 数据。希望这个工具类能在您的项目中提供帮助,记住我们的口号:“慢慢学,不要停。”

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Android系统Android.bp文件详解
  • el-tree自定义节点内容
  • Java的线程实现
  • 实时捕捉与追溯:得物基于 eBPF 打造云上网络连接异常摄像头
  • Android常用面试题
  • 2024年8月一区SCI-海市蜃楼优化算法Fata morgana algorithm-附Matlab免费代码
  • C 语言中的头文件
  • Qt QSettings操作配置文件详细介绍
  • golang下载、上传文件MD5高效计算方法,利用io.TeeReader函数特性 实时计算文件md5签名
  • 数据结构-快速排序与归并排序(递归与非递归)
  • 大数据应用组件
  • C++ | Leetcode C++题解之第327题区间和的个数
  • 编程-笔记三:行为型设计模式-小结
  • 字符函数和字符串函数(2),C语言内存函数
  • JavaScript中的Truthy Falsy值以及等号判断
  • 深入了解以太坊
  • [PHP内核探索]PHP中的哈希表
  • [译] 怎样写一个基础的编译器
  • Hibernate最全面试题
  • iOS 系统授权开发
  • Theano - 导数
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • Windows Containers 大冒险: 容器网络
  • 分布式任务队列Celery
  • 前端相关框架总和
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 我感觉这是史上最牛的防sql注入方法类
  • 写代码的正确姿势
  • 积累各种好的链接
  • ​马来语翻译中文去哪比较好?
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (vue)el-cascader级联选择器按勾选的顺序传值,摆脱层级约束
  • (八)c52学习之旅-中断实验
  • (二)斐波那契Fabonacci函数
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (一)Neo4j下载安装以及初次使用
  • (译)2019年前端性能优化清单 — 下篇
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转)setTimeout 和 setInterval 的区别
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • .gitignore文件_Git:.gitignore
  • .NET Core 中的路径问题
  • .Net CoreRabbitMQ消息存储可靠机制
  • .NET 快速重构概要1
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • .Net8 Blazor 尝鲜
  • .NET程序员迈向卓越的必由之路
  • .ui文件相关
  • ??javascript里的变量问题
  • @31省区市高考时间表来了,祝考试成功
  • @selector(..)警告提示