【问题标题】:What is the quickest way to convert XML file to JSON file in Java?在 Java 中将 XML 文件转换为 JSON 文件的最快方法是什么?
【发布时间】:2019-10-28 08:36:24
【问题描述】:

我目前有一堆 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 分钟。这似乎太过分了,我真的很想缩短完成这项工作所需的时间。

【问题讨论】:

  • 您可以使用多线程在更短的时间内完成该过程。生成线程数并为每个线程分配多个 xml 文件。
  • 您的 XML 文件有多大?有多少元素和深度?据我们所知,这可能是一个非常快的时间!
  • 说得好,杰米。谢谢你。每个文件大小为 16kb。我相信它会达到 10 或 11 的深度。
  • 你考虑过 xslt 吗?
  • 不知道会不会更快,但是试试jackson库,这个,使用线程池,将不同的文件拆分到不同的线程。

标签: java json xml file file-writing


【解决方案1】:

你可以使用这个: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());
        }
    }
}

【讨论】:

    【解决方案2】:

    您可以尝试使用 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 将是一种解决方案(虽然更快?)。

    【讨论】:

      【解决方案3】:

      Underscore-java 库有静态方法U.xmlToJson(xml)。我是项目的维护者。

      【讨论】:

        猜你喜欢
        • 2010-12-21
        • 2021-02-17
        • 1970-01-01
        • 2020-06-20
        • 2017-08-22
        • 1970-01-01
        • 2010-11-02
        • 1970-01-01
        • 2014-03-28
        相关资源
        最近更新 更多