【问题标题】:Converting multiple lines of JSON to XML using Java使用 Java 将多行 JSON 转换为 XML
【发布时间】:2019-10-20 06:23:30
【问题描述】:

如何将所有 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>

【问题讨论】:

  • 你对提供的源文件有影响吗?因为目前,您的输入不是有效的 JSON,但是您可以通过附加“[”轻松构建 JSON 数组,每行以 , 结尾,并在文件末尾放置 ]
  • 我无法影响源文件。它来自一台 GPS 设备,需要转换为 XML(如果我需要在 XML 输出中添加 node0、node1 等,那没关系)......只是在转换第一行 JSON 时遇到了麻烦。
  • 好吧,鉴于您更新的问题,它要复杂得多,因为独立的 json 对象现在不再是换行符分隔。
  • 其实我刚刚在notepad++中检查了一下,发现每行JSON的末尾都有一个CR LF char。我将输入文件调整为应有的样子(我的 IDE(intellij)将其显示为 JSON)

标签: java json xml file


【解决方案1】:

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

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 用于标记它的顶部底部。循环检查标记器是否在文件末尾,如果不是,则后退一步(未读取字符)并解析下一个值

【讨论】:

  • 使用上面的方法,我得到一个异常'线程“main”中的异常 org.json.JSONException: A JSONObject text must end with '}' at 2 [character 3 line 1]' 所以, JSON 数组为 [0] = '{', [1] = 'value':'GPS_latitude' 等。
  • 我为您更新的问题更新了答案,这应该可以解决此错误
【解决方案2】:

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

【讨论】:

  • 你说得对,Andres,当我在 IDE 中查看 JSON 文件时,我收到“JSON 标准只允许一个顶级值”错误。该文件来自一台 GPS 设备,因此无法更改。我将如何从这些行创建每个单独的 JSONObject?
  • @smac 好像你改回来了,那是什么?
  • 其实我刚刚在notepad++中检查了一下,发现每行JSON的末尾都有一个CR LF char。我将输入文件调整为应有的样子(我的 IDE(intellij)将其显示为 JSON)
猜你喜欢
  • 2015-04-11
  • 2016-07-17
  • 1970-01-01
  • 2020-09-23
  • 1970-01-01
  • 2014-08-02
  • 2013-11-27
  • 2013-06-01
相关资源
最近更新 更多