Какой самый быстрый способ конвертировать файл XML в файл JSON на Java? - PullRequest
1 голос
/ 13 июня 2019

В настоящее время у меня есть куча файлов XML (каждый размером 16 КБ), которые необходимо преобразовать в JSON, а затем записать в новые файлы. У меня есть рабочая реализация, но она очень медленная.

То, что я делаю, это захват каждого файла в каталоге, преобразование данных XML в строку, создание объекта JSON этой строки с помощью org.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 минут. Это кажется чрезмерным, и мне бы очень хотелось сократить время, необходимое для этого.

Ответы [ 2 ]

0 голосов
/ 14 июня 2019

Вы могли бы попытаться использовать 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 будет одним из решений (хотя и быстрее?).

0 голосов
/ 14 июня 2019

Вы можете использовать это: 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());
        }
    }
}
...