使用org.json转换JSON数组为XML的格式修正问题咨询
解决org.json转换JSON数组到XML时生成重复父标签的问题
使用org.json框架将复杂JSON对象转换为XML时,JSON数组的转换结果不符合预期——数组元素会生成多个与数组键名相同的标签(比如多个<cars>),期望将所有数组元素包裹在一个<cars>标签内,每个元素用<item>标签封装。
原因分析
org.json的XML.toString()方法默认行为是将JSON数组的每个元素都生成一个与数组键名一致的XML标签,这导致了重复的父标签。要实现单父标签包裹+子元素<item>的结构,需要修改框架对数组元素的标签命名规则。
解决方案1:全局设置数组元素标签名
org.json提供了静态变量XML.arrayElementName,可以全局设置数组元素的默认标签名。设置后,所有JSON数组转换为XML时,元素都会用指定的标签包裹,父数组标签只会出现一次。
依赖配置(pom.xml)
<dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20231013</version> </dependency>
示例代码
import org.json.JSONArray; import org.json.JSONObject; import org.json.XML; public class JsonToXmlConverter { public static void main(String[] args) { // 构建测试JSON对象 JSONObject root = new JSONObject(); JSONArray carsArray = new JSONArray(); carsArray.put(new JSONObject().put("brand", "Toyota").put("model", "Camry")); carsArray.put(new JSONObject().put("brand", "Honda").put("model", "Accord")); root.put("cars", carsArray); // 设置数组元素的标签为<item> XML.arrayElementName = "item"; // 转换为XML String xmlResult = XML.toString(root); System.out.println(xmlResult); } }
输出结果
<cars><item><brand>Toyota</brand><model>Camry</model></item><item><brand>Honda</brand><model>Accord</model></item></cars>
解决方案2:局部处理特定数组(避免全局影响)
如果应用中有多个数组需要不同的元素标签,全局设置会导致冲突,此时可以手动处理目标数组的XML转换:
import org.json.JSONArray; import org.json.JSONObject; import org.json.XML; public class JsonToXmlConverter { public static void main(String[] args) { JSONObject root = new JSONObject(); JSONArray carsArray = new JSONArray(); carsArray.put(new JSONObject().put("brand", "Toyota").put("model", "Camry")); carsArray.put(new JSONObject().put("brand", "Honda").put("model", "Accord")); // 手动构建cars的XML片段 StringBuilder carsXml = new StringBuilder("<cars>"); for (int i = 0; i < carsArray.length(); i++) { JSONObject car = carsArray.getJSONObject(i); // 每个元素用<item>包裹 carsXml.append("<item>").append(XML.toString(car)).append("</item>"); } carsXml.append("</cars>"); // 处理其他非数组属性(如果有) JSONObject otherProps = new JSONObject(); otherProps.put("owner", "John Doe"); String otherXml = XML.toString(otherProps); // 拼接最终XML String finalXml = String.format("%s%s", otherXml, carsXml); System.out.println(finalXml); } }
输出结果
<owner>John Doe</owner><cars><item><brand>Toyota</brand><model>Camry</model></item><item><brand>Honda</brand><model>Accord</model></item></cars>
可选:格式化XML输出
org.json生成的XML是压缩格式,如果需要带缩进的格式化输出,可以借助JDK的XML转换工具:
import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.json.JSONObject; import org.json.XML; import org.w3c.dom.Document; public class FormattedXmlConverter { public static void main(String[] args) throws Exception { JSONObject root = new JSONObject(); JSONArray carsArray = new JSONArray(); carsArray.put(new JSONObject().put("brand", "Toyota").put("model", "Camry")); carsArray.put(new JSONObject().put("brand", "Honda").put("model", "Accord")); root.put("cars", carsArray); XML.arrayElementName = "item"; String unformattedXml = XML.toString(root); // 解析XML并格式化 Document doc = XML.toJSONObject(unformattedXml).toXML(); Transformer transformer = TransformerFactory.newInstance().newTransformer(); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); StreamResult result = new StreamResult(System.out); transformer.transform(new DOMSource(doc), result); } }
格式化输出
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <cars> <item> <brand>Toyota</brand> <model>Camry</model> </item> <item> <brand>Honda</brand> <model>Accord</model> </item> </cars>
内容的提问来源于stack exchange,提问作者user10053673
相关产品推荐
相关产品推荐

