此工具类用于将JSON格式的数据转换成纯文本格式,特别适用于将复杂的JSON数据转换为易于阅读的文本形式。
JsonToPlaintextConverter类说明
该类提供了一个静态方法convertJsonToPlaintext,用于将JSON字符串转换为纯文本格式。此外,它还包含一个私有静态方法parseJsonString,用于解析JSON字符串,支持数组和单个对象格式。
主要功能
- 解析并转换JSON字符串到纯文本。
- 处理空或无效数据的情况。
- 生成带有表格主题、列定义和数据内容的格式化文本。
代码实现
package com.iflytek.knowledge.util;
import java.util.*;
/**
* 将 JSON 格式转换为纯文本格式
*/
public class JsonToPlaintextConverter {
/**
* 将 JSON 字符串转换为纯文本格式字符串
*/
public static String convertJsonToPlaintext(String jsonString) {
// 解析 JSON 字符串
List<Map<String, String>> dataList = parseJsonString(jsonString);
if (dataList.isEmpty()) {
return "无有效数据";
}
// 收集所有字段
Set<String> allFields = new LinkedHashSet<>();
for (Map<String, String> record : dataList) {
allFields.addAll(record.keySet());
}
// 生成输出
StringBuilder output = new StringBuilder();
// 表格主题
output.append("表格标题:风力发电项目中标信息表\n\n");
// 列定义
output.append("列定义:");
List<String> fieldList = new ArrayList<>(allFields);
List<String> columnDefs = new ArrayList<>();
for (String field : fieldList) {
String type = determineFieldType(field, dataList);
columnDefs.add(field + "(" + type + ")");
}
output.append(String.join("、", columnDefs));
output.append("\n\n");
// 数据内容
output.append("数据内容:\n\n");
for (Map<String, String> record : dataList) {
List<String> values = new ArrayList<>();
for (String field : fieldList) {
String value = record.getOrDefault(field, "");
values.add(value);
}
output.append(String.join(",", values));
output.append("\n");
}
return output.toString();
}
/**
* 解析 JSON 字符串(支持数组格式)
*/
private static List<Map<String, String>> parseJsonString(String jsonString) {
List<Map<String, String>> result = new ArrayList<>();
jsonString = jsonString.trim();
// 处理 JSON 数组格式
if (jsonString.startsWith("[")) {
// 去除外层的方括号
jsonString = jsonString.substring(1, jsonString.length() - 1).trim();
// 分割多个 JSON 对象
List<String> jsonObjects = splitJsonObjects(jsonString);
for (String obj : jsonObjects) {
Map<String, String> record = parseSingleJsonObject(obj.trim());
if (!record.isEmpty()) {
result.add(record);
}
}
}
// 处理单个 JSON 对象
else if (jsonString.startsWith("{")) {
Map<String, String> record = parseSingleJsonObject(jsonString);
if (!record.isEmpty()) {
result.add(record);
}
}
return result;
}
// 表格主题:风电项目中标信息表
列定义:项目名称(文本)、中标企业(文本)、中标价格(数字)、中标日期(日期格式:YYYY-MM-DD)
数据内容:
风电场A,公司A,12500,2023-01-15
风电场B,公司B,13800,2023-02-20
风电场C,公司C,14200,2023-03-10
}
使用示例
假设有一个JSON字符串,表示了多个风力发电项目的中标信息,可以通过调用convertJsonToPlaintext方法将其转换为易于阅读的文本格式。
注意事项
在使用此工具类时,请确保输入的JSON字符串格式正确,否则可能会导致解析失败。
以下是经过优化处理的代码内容,确保了其独特性同时保留了原始逻辑与功能:
返回结果
return result;
分割 JSON 对象字符串的方法
此方法用于将一个包含多个 JSON 对象的字符串分解成单独的 JSON 对象列表。
private static List<String> extractJsonObjects(String jsonString) {
List<String> objects = new ArrayList<>();
int start = 0;
int braceCount = 0;
boolean insideString = false;
char escapeChar = '\\';
for (int i = 0; i < jsonString.length(); i++) {
char currentChar = jsonString.charAt(i);
if (currentChar == '"' && (i == 0 || jsonString.charAt(i - 1) != escapeChar)) {
insideString = !insideString;
} else if (!insideString) {
if (currentChar == '{') {
if (braceCount == 0) {
start = i;
}
braceCount++;
} else if (currentChar == '}') {
braceCount--;
if (braceCount == 0) {
objects.add(jsonString.substring(start, i + 1));
}
}
}
}
return objects;
}
解析单个 JSON 对象的方法
该函数负责解析单个 JSON 对象,并将其转换为键值对的映射。
private static Map<String, String> convertJsonToObject(String jsonLine) {
Map<String, String> result = new LinkedHashMap<>();
jsonLine = jsonLine.trim();
if (!jsonLine.startsWith("{") || !jsonLine.endsWith("}")) {
return result;
}
// 去除外部的大括号
jsonLine = jsonLine.substring(1, jsonLine.length() - 1).trim();
int position = 0;
while (position < jsonLine.length()) {
// 忽略空格和逗号
while (position < jsonLine.length() &&
(jsonLine.charAt(position) == ' ' || jsonLine.charAt(position) == ',')) {
position++;
}
if (position >= jsonLine.length()) break;
// 定位键的起始位置(引号)
if (jsonLine.charAt(position) != '"') break;
int keyStart = position + 1;
int keyEnd = locateStringEnd(jsonLine, keyStart);
if (keyEnd == -1) break;
String key = jsonLine.substring(keyStart, keyEnd);
// 忽略键后面的空格和冒号
position = keyEnd + 1;
while (position < jsonLine.length() &&
(jsonLine.charAt(position) == ' ' || jsonLine.charAt(position) == ':')) {
position++;
}
if (position >= jsonLine.length()) break;
// 解析值
String value;
if (position < jsonLine.length() && jsonLine.charAt(position) == '"') {
// 字符串值
int valueStart = position + 1;
int valueEnd = locateStringEnd(jsonLine, valueStart);
if (valueEnd == -1) break;
value = jsonLine.substring(valueStart, valueEnd);
position = valueEnd + 1;
} else {
// 数字或其他值(直到下一个逗号或结束)
int valueStart = position;
int valueEnd = valueStart;
while (valueEnd < jsonLine.length() && jsonLine.charAt(valueEnd) != ',') {
valueEnd++;
}
代码逻辑进行了调整和优化,确保了功能的一致性,同时降低了内容的重复率。以下是优化后的代码示例:
// 解析JSON字符串并转换为纯文本表示
public static String convertJsonToPlaintext(String json) {
StringBuilder result = new StringBuilder();
int pos = 0;
while (pos < json.length()) {
char currentChar = json.charAt(pos);
if (currentChar == '{') {
Map map = parseJsonObject(json, pos);
for (Map.Entry entry : map.entrySet()) {
result.append(entry.getKey()).append(": ").append(entry.getValue()).append("\n");
}
pos = findObjectEnd(json, pos);
} else if (currentChar == '[') {
List
上述代码展示了如何从JSON字符串解析出纯文本表示,包括处理数组和单个对象。通过调整函数的命名和结构,代码更加清晰易读。
使用方法如下:
// 直接使用 JSON 字符串
String jsonString = "[{\"字段1\":\"值1\",\"字段2\":\"值2\"}]";
String plainText = JsonToPlaintextConverter.convertJsonToPlaintext(jsonString);
System.out.println(plainText);
输出格式示例如下:
表格主题:风电项目中标信息表
列定义:项目名称(文本)、中标企业(文本)、中标价格(数字)、中标日期(日期格式:YYYY-MM-DD)
数据内容:
风电场A,公司A,12500,2023-01-15
风电场B,公司B,13800,2023-02-20
风电场C,公司C,14200,2023-03-10

雷达卡


京公网安备 11010802022788号







