JSON文件中的数据格式
单条数据展开后如下:
{
"text": "《邪少兵王》是冰火未央写的网络小说连载于旗峰天下",
"spo_list":
[
{
"predicate": "作者",
"object_type":
{
"@value": "人物"
},
"subject_type": "图书作品",
"object":
{
"@value": "冰火未央"
},
"subject": "邪少兵王"
}
]
}
测试文件转换的接口
【因为测试直接文件转化为CSV,目前的这种json数据格式在转化为JSONArray时总会报格式错误,因此我将JSON文件中的数据以换行符为分割符,进行字符串的分割,从直接文件转化改为一行数据一行数据的转化,转化结果最后存储到CSV文件中,就能成功,代码如下】
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 测试文件转换的控制层
*/
@RestController
@RequestMapping("/tocsv")
@RequiredArgsConstructor
public class JsonToCSVController {
/**
* 测试接口
* 批量转换json文件——csv文件
*/
@RequestMapping("/test2")
public static void tocsv2() {
String jsonFilePath = "E:\\duie_train.json"; // JSON文件路径
// String csvFilePath = "E:\\output.csv"; // CSV文件输出路径
try {
// 读取JSON文件内容
String jsonContent = new String(Files.readAllBytes(Paths.get(jsonFilePath)));
// System.out.println(jsonContent);
String[] jsonEntries = jsonContent.split("\\n");
// 创建一个集合来存储分割后的JSON字符串
List<String> splitJsonList = new ArrayList<>();
// 遍历分割后的字符串数组
for (String jsonEntry : jsonEntries) {
// 移除字符串中的空白字符
String trimmedJsonEntry = jsonEntry.trim();
// 如果字符串不为空(即它是一个有效的JSON对象),则添加到集合中
if (!trimmedJsonEntry.isEmpty()) {
splitJsonList.add(trimmedJsonEntry);
}
}
convertJsonToCsvlist(splitJsonList, "E:\\output.csv");
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 方法
* 批量转换json文件——csv文件
* @param jsonList
* @param outputFilePath
* @throws IOException
*/
public static void convertJsonToCsvlist(List<String> jsonList, String outputFilePath) throws IOException {
try (FileWriter writer = new FileWriter(outputFilePath)) {
// 写入 CSV 标题行
writer.append("text").append(",").append("predicate").append(",").append("object_type").append(",").append("subject_type").append(",").append("object").append(",").append("subject").append("\n");
// 遍历集合中的每个JSON字符串
for (String jsonStr : jsonList) {
JSONObject jsonObject = JSONObject.parseObject(jsonStr);
String text = jsonObject.getString("text");
JSONArray spoList = jsonObject.getJSONArray("spo_list");
for (Object spo : spoList) {
JSONObject spoObj = (JSONObject) spo;
writer.append(text).append(",");
writer.append(spoObj.getString("predicate")).append(",");
JSONObject objectTypeObj = spoObj.getJSONObject("object_type");
writer.append(objectTypeObj != null ? objectTypeObj.getString("@value") : "").append(",");
writer.append(spoObj.getString("subject_type")).append(",");
JSONObject objectObj = spoObj.getJSONObject("object");
writer.append(objectObj != null ? objectObj.getString("@value") : "").append(",");
writer.append(spoObj.getString("subject")).append("\n");
}
}
}
}
}