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": "[email protected]", "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 格式的内容,则返回 null
return 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": "[email protected]", "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 格式。我们尝试将字符串解析为 JSONObject
或 JSONArray
,如果成功,则返回 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 数据。希望这个工具类能在您的项目中提供帮助,记住我们的口号:“慢慢学,不要停。”
文章评论