Преобразование нескольких строк JSON в XML с использованием Java - PullRequest
0 голосов
/ 04 июня 2019

Как вывести все строки JSON в один вывод XML? Мой код выводит только первую строку JSON.

У меня есть файл данных, который содержит несколько строк JSON (CR & LF в конце каждой строки JSON):

{"valueName":"GPS_latitude","valueType":"-1","value":"39.26842508","objectID":"charger_80","timestamp":"1556841594000"}
{"valueName":"GPS_longitude","valueType":"-1","value":"-76.60410104","objectID":"charger_80","timestamp":"1556841594000"}
{"valueName":"GPS_altitude","valueType":"-1","value":"13","objectID":"charger_80","timestamp":"1556841594000"}

Мой Java-источник выглядит так:

import org.json.JSONObject; 
import org.json.XML;

//Reads in the file and makes it one big string (which works correctly) 
String jsonData = readFile("testfilePD.json");

//Converts the JSON string into XML but stops after first line. 
String jsonBody = Convert_JSON_TO_XML.convert_json(jsonData); System.out.println(jsonBody);

//I'm using the XML library to convert    
public static String convert_json(String json_value) {
    String xml = "<node>";
    try {
        JSONObject jsoObject = new JSONObject(json_value);
        xml = xml + XML.toString(jsoObject);
    } catch (Exception e) {
        System.out.println(e);
    }
    xml = xml + "</node>";
    return xml;
}

Или есть ли лучшая библиотека для преобразования JSON в XML? Или как мне изменить библиотеку XML, чтобы прочитать весь мой файл и правильно вывести их в один большой файл XML. В конце концов я отправляю этот XML-файл в API веб-службы для приема внутрь. Я застрял.

Вывод должен быть примерно таким:

<?xml version="1.0"?>
<node>
<valueName>GPS_latitude</valueName>
<valueType>-1</valueType>
<value>39.26842508</value>
<objectID>charger_80</objectID>
<timestamp>1556841594000</timestamp>
</node>
<node>
<valueName>GPS_longitude</valueName>
<valueType>-1</valueType>
<value>-76.60410104</value>
<objectID>charger_80</objectID>
<timestamp>1556841594000</timestamp>
</node>

Ответы [ 2 ]

2 голосов
/ 04 июня 2019

Это должно решить вашу проблему:

import org.json.JSONArray;
import org.json.JSONTokener;
import org.json.XML;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

public class ConvertExample {
    public static void main(String[] args) throws IOException {
        JSONTokener tokener = new JSONTokener(Files.newInputStream(Paths.get("test.json")));
        JSONArray array = new JSONArray();

        while(tokener.nextClean() != '\u0000'){
            tokener.back();
            array.put(tokener.nextValue());
        }

        // Print XML with each array entry named node
        System.out.println(XML.toString(array, "node"));
    }
}

Обновлено для обновленного вопроса Здесь JSONTokener используется для токенизации его верхнего дна. Цикл проверяет, находится ли токенизатор в конце файла, и если нет, возвращается на шаг назад (не читает символ) и анализирует следующее значение

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

Это не файл JSON, поэтому вы не можете использовать new JSONObject(json_value), где json_value - это все содержимое файла.

Файл представляет собой список текстов JSON, по одному на строку, поэтому вам нужно читать каждую строку отдельно, например, используя BufferedReader, и анализируйте каждую строку отдельно, получая JSONObject[].

Тогда вам необходимо решить, станет ли каждый отдельный текст JSON отдельным корневым XML-элементом или XML будет объединен.


ОБНОВЛЕНИЕ: Чтобы прочитать и преобразовать в XML, вы можете сделать это следующим образом:

StringBuilder buf = new StringBuilder();
Files.lines(Paths.get("testfilePD.json")).forEach(line -> {
    JSONObject jsoObject = new JSONObject(line);
    buf.append(XML.toString(jsoObject, "node"))
       .append(System.lineSeparator());
});
System.out.println(buf.toString());

выход

<node><valueName>GPS_latitude</valueName><valueType>-1</valueType><value>39.26842508</value><objectID>charger_80</objectID><timestamp>1556841594000</timestamp></node>
<node><valueName>GPS_longitude</valueName><valueType>-1</valueType><value>-76.60410104</value><objectID>charger_80</objectID><timestamp>1556841594000</timestamp></node>
<node><valueName>GPS_altitude</valueName><valueType>-1</valueType><value>13</value><objectID>charger_80</objectID><timestamp>1556841594000</timestamp></node>

Обратите внимание, что сгенерированный XML так же недействителен, как и исходный JSON, поскольку оба имеют более одного корневого элемента / объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...