使用Java将多行JSON转换为XML

时间:2019-06-04 17:24:44

标签: java json xml file

如何将所有JSON行输出到一个XML输出中?我的代码仅输出第一行JSON。

我有一个数据文件,其中包含几条JSON行(每条JSON行的末尾都有CR和LF):

{"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 src看起来像:

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文件发送到Web服务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 个答案:

答案 0 :(得分:2)

这应该可以解决您的问题:

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对其进行标记。循环检查令牌生成器是否在文件末尾,如果不是,则退后一步(未读取字符)并解析下一个值

答案 1 :(得分:0)

该文件不是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一样无效,因为两者都有多个根元素/对象。