在Java中将XML文件转换为JSON文件的最快方法是什么?

时间:2019-06-13 17:28:39

标签: java json xml file file-writing

我目前有一堆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分钟。这似乎过多了,我真的很想减少完成此操作所需的时间。

3 个答案:

答案 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)。我是该项目的维护者。