Java 处理 json 格式数据解析为 csv 格式
Java处理json格式数据解析为csv格式
如果不使用 JSON 工具库,你可以手动解析 JSON 格式字符串并将其转换为 CSV 格式字符串。
以下是一个简单示例,展示如何实现这一功能。
示例代码
下面的示例代码手动处理 JSON 字符串,将其转换为 CSV 格式字符串:
/**
* 接收 JSON 字符串,去掉开头和结尾的方括号,按对象划分。
* 通过 extractKeys 方法提取字段名,添加到 CSV 的第一行。
* 逐项解析 JSON 对象,并通过 extractValues 获取对应的值,添加到 CSV 的后续行。
*
* @param jsonString json格式字符串
* @param header 输出是否包含头标题 true包含 false不包含
* @return csv 格式字符串
*/
public static String convertJsonToCsv(String jsonString, boolean header) {
StringBuilder csvBuilder = new StringBuilder();
// 假设 JSON 是一个数组的形式
if (jsonString.startsWith("[") && jsonString.endsWith("]")) {
// 去掉开头和结尾的方括号
jsonString = jsonString.substring(1, jsonString.length() - 1).trim();
String[] jsonObjects = jsonString.split("},\\s*\\{"); // 按对象划分
// 处理第一项获取字段名
if (header) {
String[] keys = extractKeys(jsonObjects[0]);
csvBuilder.append(String.join(",", keys)).append("\n");
}
// 逐个处理 JSON 对象
for (String jsonObject : jsonObjects) {
jsonObject = jsonObject.replaceAll("[{}\"]", ""); // 去掉大括号和双引号
String[] values = extractValues(jsonObject);
csvBuilder.append(String.join(",", values)).append("\n");
}
} else {
// 处理第一项获取字段名
if (header) {
String[] keys = extractKeys(jsonString);
csvBuilder.append(String.join(",", keys)).append("\n");
}
String[] values = extractValues(jsonString);
csvBuilder.append(String.join(",", values)).append("\n");
}
return csvBuilder.substring(0, csvBuilder.length() - 1);
}
/**
* 提取 JSON 对象的键,通过分隔符将 JSON 对象的属性解析成键的字符串数组。
*
* @param jsonString json格式字符串
* @return JSON 对象的键
*/
public static String[] extractKeys(String jsonString) {
String[] parts = jsonString.split(",");
String[] keys = new String[parts.length];
for (int i = 0; i < parts.length; i++) {
keys[i] = parts[i].split(":")[0].trim().replace("{", "").replace("}", "").replace("\"", "");
}
return keys;
}
/**
* 提取 JSON 对象的键,通过分隔符将 JSON 对象的属性解析成键的字符串数组。
*
* @param jsonString json格式字符串
* @return JSON 对象的键字符串
*/
public static String extractKeysToString(String jsonString) {
String[] values = extractKeys(jsonString);
return String.join(",", values);
}
/**
* 提取 JSON 对象的值,根据键的顺序,从 JSON 对象中对应地提取值。
*
* @param jsonString json格式字符串
* @return JSON 对象的值
*/
public static String[] extractValues(String jsonString) {
String[] parts = jsonString.split(",");
String[] values = new String[parts.length];
for (int i = 0; i < parts.length; i++) {
String value = parts[i].split(":")[1].trim().replace("{", "").replace("}", "").replace("\"", "");
values[i] = value; // 此处直接取值,假设没有嵌套和特殊字符
}
return values;
}
/**
* 提取 JSON 对象的值,根据键的顺序,从 JSON 对象中对应地提取值。
*
* @param jsonString json格式字符串
* @return JSON 对象的值字符串
*/
public static String extractValuesToString(String jsonString) {
String[] values = extractValues(jsonString);
return String.join(",", values);
}
public static void main(String[] args) {
String json = "[{\"省份\":\"北京\",\"大学数量\":\"50\",\"大专数量\":\"80\",\"中专数量\":\"120\"}," +
"{\"省份\":\"上海\",\"大学数量\":\"45\",\"大专数量\":\"75\",\"中专数量\":\"110\"}]";
String string = "{\"省份\":\"北京\",\"大学数量\":\"50\",\"大专数量\":\"80\",\"中专数量\":\"120\"}";
System.out.println(Arrays.toString(extractKeys(string)));
System.out.println(Arrays.toString(extractValues(string)));
System.out.println(extractKeysToString(string));
System.out.println(extractValuesToString(string));
String csvOutputWithHeader = convertJsonToCsv(json, true);
System.out.println("csvOutputWithHeader:\n" + csvOutputWithHeader);
String csvOutputNoHeader = convertJsonToCsv(json, false);
System.out.println("csvOutputNoHeader:\n" + csvOutputNoHeader);
}
测试数据结果:
[省份, 大学数量, 大专数量, 中专数量]
[北京, 50, 80, 120]
省份,大学数量,大专数量,中专数量
北京,50,80,120
csvOutputWithHeader:
省份,大学数量,大专数量,中专数量
北京,50,80,120
上海,45,75,110
csvOutputNoHeader:
北京,50,80,120
上海,45,75,110