在Java开发中,将JSON数据转换为XML格式是常见需求,比如需要对接仅支持XML格式的旧系统接口,或者需要将JSON数据持久化存储为符合XML规范的文档。实现这个转换功能不需要手动解析JSON再拼接XML字符串,借助成熟的第三方库可以高效完成。

方案一:使用json_lib库实现转换
json_lib是较早出现的JSON处理库,内置了JSON转XML的直接方法,使用起来比较简单,不过需要注意该库的依赖配置。
环境依赖
需要在项目中引入json_lib的相关依赖,如果是Maven项目,在pom.xml中添加如下配置:
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
核心实现代码
json_lib提供了XMLSerializer类,可以直接将JSON对象序列化为XML字符串,示例代码如下:
import net.sf.json.JSONObject;
import net.sf.json.xml.XMLSerializer;
public class JsonToXmlByJsonLib {
public static void main(String[] args) {
// 待转换的JSON字符串
String jsonStr = "{"user":{"name":"张三","age":25,"hobby":["篮球","阅读"]}}";
// 将字符串解析为JSON对象
JSONObject jsonObject = JSONObject.fromObject(jsonStr);
// 创建XML序列化器
XMLSerializer xmlSerializer = new XMLSerializer();
// 设置XML的根节点名称,默认是o
xmlSerializer.setRootName("data");
// 执行转换
String xmlResult = xmlSerializer.write(jsonObject);
System.out.println("转换后的XML结果:");
System.out.println(xmlResult);
}
}
上述代码运行后输出的XML内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<data>
<user>
<name>张三</name>
<age>25</age>
<hobby>篮球</hobby>
<hobby>阅读</hobby>
</user>
</data>
注意事项
- json_lib对复杂JSON结构的支持有限,比如嵌套层级过深或者包含特殊字符时可能出现转换异常
- 该库已经停止更新,新项目不建议优先选择
- 如果JSON中包含数组,转换后数组的每个元素会成为同名的XML子节点
方案二:使用org_json库实现转换
org_json是更轻量、维护更活跃的JSON处理库,很多主流项目都在使用,它同样提供了JSON转XML的能力,兼容性更好。
环境依赖
Maven项目添加如下依赖:
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20230227</version>
</dependency>
核心实现代码
org_json中通过XML类的toString方法实现转换,示例代码如下:
import org.json.JSONObject;
import org.json.XML;
public class JsonToXmlByOrgJson {
public static void main(String[] args) {
// 待转换的JSON字符串
String jsonStr = "{"user":{"name":"李四","age":30,"address":{"city":"北京","street":"朝阳路"}}}";
// 解析为JSON对象
JSONObject jsonObject = new JSONObject(jsonStr);
// 执行转换,第二个参数是根节点名称
String xmlResult = XML.toString(jsonObject, "result");
System.out.println("转换后的XML结果:");
System.out.println(xmlResult);
}
}
上述代码运行后输出的XML内容如下:
<result>
<user>
<name>李四</name>
<age>30</age>
<address>
<city>北京</city>
<street>朝阳路</street>
</address>
</user>
</result>
注意事项
- org_json的转换逻辑更贴合JSON和XML的规范,对嵌套对象、特殊字符的处理更稳健
- 如果JSON中存在JSONArray类型的数组,转换后需要通过自定义逻辑处理数组节点的命名,默认会按照索引生成子节点
- 该库支持自定义XML的缩进、编码等属性,需要额外编写处理逻辑
两种方案对比
我们可以通过如下表格对比两种实现的差异,方便选择适合自己项目的方案:
| 对比项 | json_lib方案 | org_json方案 |
|---|---|---|
| 依赖体积 | 较大,需要依赖多个辅助包 | 轻量,仅一个核心包 |
| 维护状态 | 停止更新,存在兼容风险 | 持续更新,兼容性好 |
| 复杂结构支持 | 一般,易出现异常 | 较好,处理更规范 |
| 使用难度 | 低,内置序列化器 | 低,API简洁 |
自定义转换逻辑说明
如果上述两种库的默认转换结果不符合需求,比如需要自定义XML节点的命名规则、处理特殊字符的转义,也可以手动实现转换逻辑。核心思路是先解析JSON的所有键值对,再按照XML的语法规则拼接字符串,注意需要对<、>、&等特殊字符进行转义,避免生成不符合规范的XML。
手动实现的基础示例代码如下:
import org.json.JSONObject;
public class CustomJsonToXml {
public static void main(String[] args) {
String jsonStr = "{"id":1,"content":"测试<内容>"}";
JSONObject jsonObject = new JSONObject(jsonStr);
StringBuilder xmlBuilder = new StringBuilder();
xmlBuilder.append("<?xml version="1.0" encoding="UTF-8"?>");
xmlBuilder.append("<root>");
// 遍历JSON的所有键
for (String key : jsonObject.keySet()) {
Object value = jsonObject.get(key);
// 转义特殊字符
String safeValue = value.toString().replace("<", "<").replace(">", ">").replace("&", "&");
xmlBuilder.append("<").append(key).append(">").append(safeValue).append("</").append(key).append(">");
}
xmlBuilder.append("</root>");
System.out.println("自定义转换结果:");
System.out.println(xmlBuilder.toString());
}
}
实际开发中优先选择成熟的第三方库实现JSON转XML,减少重复开发和潜在的逻辑漏洞,只有在库无法满足特殊转换需求时再考虑手动实现。