我目前有一堆XML文件(每个文件大小为16kb),需要将其转换为JSON,然后再写入新文件。我有一个可行的实施方案,但是非常慢。
我正在做的是抓取目录中的每个文件,将XML数据转换为字符串,使用org.json创建该字符串的JSON对象,然后使用FileWriter将其写入文件中
import org.json.JSONObject;
import org.json.XML;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import org.apache.commons.io.FilenameUtils;
public class TestConvert {
public static void main(String[] args) {
final File xmlFolder = new File("C:\\files\\xml_files");
final File jsonFolder = new File("C:\\files\\json_files");
for(File fileEntry: xmlFolder.listFiles()){
try {
String xml = new String(Files.readAllBytes(fileEntry.toPath()), StandardCharsets.UTF_8);
JSONObject obj = XML.toJSONObject(xml);
String completeDir = jsonFolder + "\\" + FilenameUtils.removeExtension(fileEntry.getName()) + ".json";
FileWriter file = new FileWriter(completeDir);
obj.write(file);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
这确实有效,但是我目前正在使用〜370k XML文件进行测试,运行时间超过45分钟。这似乎过多了,我真的很想减少完成此操作所需的时间。
答案 0 :(得分:0)
您可以使用以下命令:https://github.com/stleary/JSON-java
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20180813</version>
</dependency>
和Java文件:
import org.json.JSONObject;
import org.json.XML;
public class Main {
public static int PRETTY_PRINT_INDENT_FACTOR = 4;
public static String TEST_XML_STRING =
"<?xml version=\"1.0\" ?><test attrib=\"moretest\">Turn this to JSON</test>";
public static void main(String[] args) {
try {
JSONObject xmlJSONObj = XML.toJSONObject(TEST_XML_STRING);
String jsonPrettyPrintString = xmlJSONObj.toString(PRETTY_PRINT_INDENT_FACTOR);
System.out.println(jsonPrettyPrintString);
} catch (JSONException je) {
System.out.println(je.toString());
}
}
}
答案 1 :(得分:0)
您可能已经尝试使用BufferedOutputStream或以下方法。
我使用Files.list,因为传统的File.listFiles
对于大型目录来说很慢。
final Path xmlFolder = Paths.get("C:\\files\\xml_files");
final Path jsonFolder = xmlFolder.resolveSibling("json_files");
Files.list(xmlFolder)
.forEach(path -> {
try {
String xml = new String(Files.readAllBytes(fileEntry.toPath()),
StandardCharsets.UTF_8);
// 1
final int initialXmlSize = 320 * 1024;
JSONObject obj = XML.toJSONObject(xml);
StringWriter xmlOut = new StringWriter(initialXmlSize);
obj.write(xmlOut);
String xml = xmlOut.toString();
// 2
String jsonFileName = path.getFileName().toString().replaceFirst("\\.[^\\.]+$",
"") + ".json";
Path xmlPath = jsonFolder.resolve(jsonFileName);
Files.write(xmlPath, xml.getBytes(StandardCharsets.UTF_8));
} catch (IOException e) {
System.err.println("File " + path);
e.printStackTrace();
}
}
// 1
和// 2
之间的代码可以进一步优化,以仅使用字符串,不使用DOM对象(XM,JSON)。 XSLT 是一种解决方案(虽然更快?)。
答案 2 :(得分:0)
Underscore-java库具有静态方法U.xmlToJson(xml)
。我是该项目的维护者。