全部版块 我的主页
论坛 数据科学与人工智能 人工智能
56 0
2025-11-20

此工具类用于将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> list = parseJsonArray(json, pos);
            for (Map item : list) {
                for (Map.Entry entry : item.entrySet()) {
                    result.append(entry.getKey()).append(": ").append(entry.getValue()).append("\n");
                }
                result.append("\n"); // 分隔不同对象
            }
            pos = findArrayEnd(json, pos);
        } else {
            pos++;
        }
    }
    return result.toString().trim();
}

// 解析单个JSON对象
private static Map parseJsonObject(String json, int startPos) {
    Map result = new HashMap<>();
    int pos = startPos + 1; // 跳过开头的'{'
    while (pos < json.length() && json.charAt(pos) != '}') {
        String key = parseKey(json, pos);
        pos = findKeyEnd(json, pos) + 1; // 跳过':'
        String value = parseValue(json, pos);
        pos = findValueEnd(json, pos) + 1; // 跳过逗号或结尾
        result.put(key, value);
    }
    return result;
}

// 解析JSON数组
private static List> parseJsonArray(String json, int startPos) {
    List> result = new ArrayList<>();
    int pos = startPos + 1; // 跳过开头的'['
    while (pos < json.length() && json.charAt(pos) != ']') {
        Map item = parseJsonObject(json, pos);
        result.add(item);
        pos = findObjectEnd(json, pos) + 1; // 跳过逗号或结尾
    }
    return result;
}

// 查找键结束位置
private static int findKeyEnd(String str, int start) {
    return str.indexOf(':', start);
}

// 查找值结束位置(处理转义字符)
private static int findValueEnd(String str, int start) {
    return findStringEnd(str, start);
}

// 查找对象结束位置
private static int findObjectEnd(String str, int start) {
    return str.indexOf('}', start);
}

// 查找数组结束位置
private static int findArrayEnd(String str, int start) {
    return str.indexOf(']', start);
}

// 解析键
private static String parseKey(String str, int start) {
    return parseValue(str, start);
}

// 解析值
private static String parseValue(String str, int start) {
    int end = findStringEnd(str, start);
    return str.substring(start, end).trim();
}

// 查找字符串结束位置(处理转义字符)
private static int findStringEnd(String str, int start) {
    for (int i = start; i < str.length(); i++) {
        char c = str.charAt(i);
        if (c == '"' && (i == 0 || str.charAt(i - 1) != '\\')) {
            return i;
        }
    }
    return -1;
}

// 根据字段名和数据内容确定字段类型
private static String determineFieldType(String fieldName, List> dataList) {
    // 判断字段名中是否包含特定关键词
    if (fieldName.contains("价格") || fieldName.contains("造价") || fieldName.contains("金额") || fieldName.contains("费用")) {
        return "数字";
    }
    if (fieldName.contains("日期") || fieldName.contains("时间")) {
        return "日期格式:YYYY-MM-DD";
    }
    // 检查实际数据以确定字段类型
    for (Map record : dataList) {
        String value = record.get(fieldName);
        if (value != null && !value.isEmpty()) {
            // 检查是否为数字(整数或小数)
            if (value.matches("-?\\d+(\\.\\d+)?")) {
                return "数字";
            }
            // 检查日期格式
            if (value.matches("\\d{4}-\\d{2}-\\d{2}")) {
                return "日期格式:YYYY-MM-DD";
            }
        }
    }
    // 默认为文本类型
    return "文本";
}

// 使用示例
public static void main(String[] args) {
    // 示例 JSON 数据
    String jsonArray = "[{\"项目名称\": \"风电场A\", \"中标企业\": \"公司A\", \"中标价格\": \"12500\", \"中标日期\": \"2023-01-15\"}," +
                       "{\"项目名称\": \"风电场B\", \"中标企业\": \"公司B\", \"中标价格\": \"13800\", \"中标日期\": \"2023-02-20\"}," +
                       "{\"项目名称\": \"风电场C\", \"中标企业\": \"公司C\", \"中标价格\": \"14200\", \"中标日期\": \"2023-03-10\"}]";
    // 单个 JSON 对象
    String singleJson = "{\"项目名称\": \"测试项目\", \"中标企业\": \"测试公司\", \"中标价格\": \"10000\", \"中标日期\": \"2023-04-01\"}";
    // 转换 JSON 数组
    System.out.println("=== JSON 数组转换结果 ===");
    String result1 = convertJsonToPlaintext(jsonArray);
    System.out.println(result1);
    System.out.println("=== 单个 JSON 对象转换结果 ===");
    String result2 = convertJsonToPlaintext(singleJson);
    System.out.println(result2);
}

上述代码展示了如何从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

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群