如何将指定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
相关产品推荐
相关产品推荐

