You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将指定JSON转换为目标CSV格式?附Java代码

解决JSON转特定CSV格式的问题

我明白你的需求啦——现在你的代码把每个模块直接输出成JSON字符串,而你需要把每个键值对拆分成单独的行,格式是「模块名 键名 值」。咱们来改改代码实现这个效果:

首先,核心思路是遍历顶层的每个模块(比如Header、CDD),再遍历模块内的每个键值对,逐行拼接输出格式。以下是完整的实现代码:

import org.json.JSONException;
import org.json.JSONObject;
import java.util.HashMap;
import java.util.Iterator;

public class Test {
    // 把JSON字符串转成HashMap的方法(补充完整)
    private static HashMap<String, Object> getHashMapFromJson(String json) throws JSONException {
        HashMap<String, Object> map = new HashMap<>();
        JSONObject rootJson = new JSONObject(json);
        Iterator<String> keys = rootJson.keys();
        
        while (keys.hasNext()) {
            String key = keys.next();
            Object value = rootJson.get(key);
            // 如果值是JSONObject,直接存入map
            if (value instanceof JSONObject) {
                map.put(key, value);
            } else {
                map.put(key, value);
            }
        }
        return map;
    }

    // 生成目标格式的输出字符串
    private static String convertToTargetFormat(HashMap<String, Object> dataMap) {
        StringBuilder result = new StringBuilder();
        
        for (String moduleName : dataMap.keySet()) {
            Object moduleData = dataMap.get(moduleName);
            // 确保模块内的数据是JSONObject
            if (moduleData instanceof JSONObject) {
                JSONObject jsonObj = (JSONObject) moduleData;
                Iterator<String> keys = jsonObj.keys();
                
                while (keys.hasNext()) {
                    String key = keys.next();
                    Object value = jsonObj.get(key);
                    // 处理值的格式:如果是字符串就去掉引号,其他类型直接转字符串
                    String valueStr = value instanceof String ? (String) value : value.toString();
                    // 这里如果需要把键名首字母大写(比如person转Person),可以加个小处理
                    String formattedKey = key.substring(0, 1).toUpperCase() + key.substring(1);
                    // 拼接成目标行
                    result.append(moduleName).append(" ").append(formattedKey).append(" ").append(valueStr).append("\n");
                }
            }
        }
        // 去掉最后一行的换行符
        if (result.length() > 0) {
            result.deleteCharAt(result.length() - 1);
        }
        return result.toString();
    }

    public static void main(String[] args) throws JSONException {
        // 模拟输入的JSON字符串
        String inputJson = "{\"Header\": {\"id\": 12345, \"value\": \"123\", \"person\": \"1\"}, \"CDD\": {\"CDDid\": 3456}}";
        HashMap<String, Object> dataMap = getHashMapFromJson(inputJson);
        String output = convertToTargetFormat(dataMap);
        System.out.println(output);
    }
}

代码关键点说明:

  • 遍历顶层模块:通过rootJson.keys()获取Header、CDD这些顶层键
  • 遍历模块内键值对:对每个模块对应的JSONObject,再次遍历其内部的键
  • 格式处理:
    • 把字符串类型的值去掉引号(避免输出像"123"这样的带引号内容)
    • 可选的键名首字母大写处理(比如把person转成Person,匹配你要的目标格式)
  • 拼接输出:每行按照「模块名 键名 值」的格式拼接,最后去掉多余的换行符

运行这段代码后,输出就是你想要的:

Header Id 12345
Header Value 123
Header Person 1
CDD CDDid 3456

如果不需要键名首字母大写,直接把formattedKey换成key就行,输出就会是Header person 1这种格式。

内容的提问来源于stack exchange,提问作者Aashish Soni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:06:13