JSON 转 XML 完整指南 - 转换规则与最佳实践(2026)

1351 字
7 分钟
JSON 转 XML 完整指南 - 转换规则与最佳实践(2026)

📖 为什么需要 JSON 转 XML?#

在现代开发中,我们经常遇到这样的场景:

场景 1:系统集成

你的现代 Web 应用(使用 JSON)
↓
需要与银行系统对接(只支持 XML/SOAP)
↓
必须进行 JSON → XML 转换

场景 2:数据迁移

旧系统导出:XML 格式
新系统导入:需要 JSON 格式
或者反过来:JSON → XML

场景 3:第三方 API

某些政府接口、企业接口仍要求 XML 格式
即使你的应用使用 JSON

本文将详解 JSON 转 XML 的完整规则和最佳实践。


🔄 核心转换规则#

规则 1:对象 → XML 元素#

JSON 对象:

{
"person": {
"name": "John",
"age": 30
}
}

转换后:

<person>
<name>John</name>
<age>30</age>
</person>

规则说明:

  • JSON 的键名 → XML 元素名
  • JSON 的值 → XML 元素内容
  • 嵌套对象 → 嵌套元素

规则 2:数组 → 重复元素#

JSON 数组:

{
"users": [
{"name": "John"},
{"name": "Jane"},
{"name": "Bob"}
]
}

转换方式 1(默认 item):

<users>
<item>
<name>John</name>
</item>
<item>
<name>Jane</name>
</item>
<item>
<name>Bob</name>
</item>
</users>

转换方式 2(自定义标签名):

<users>
<user>
<name>John</name>
</user>
<user>
<name>Jane</name>
</user>
<user>
<name>Bob</name>
</user>
</users>

最佳实践:

  • 数组项标签名应该有意义(如 user 而不是 item)
  • 保持复数形式(users 包含多个 user)

规则 3:基本类型转换#

字符串:

{"name": "John Doe"}
<name>John Doe</name>

数字:

{"age": 30, "price": 19.99}
<age>30</age>
<price>19.99</price>

布尔值:

{"active": true, "deleted": false}
<active>true</active>
<deleted>false</deleted>

null 值:

{"nickname": null}

转换方式 1(空元素):

<nickname/>

转换方式 2(xsi):

<nickname xsi:nil="true"/>

规则 4:特殊字符转义#

JSON 中的特殊字符在 XML 中需要转义:

小于号和大于号:

{"message": "Hello <World>"}
<message>Hello &lt;World&gt;</message>

引号:

{"quote": "He said \"Hello\""}
<quote>He said &quot;Hello&quot;</quote>

与号:

{"formula": "A & B"}
<formula>A &amp; B</formula>

完整转义表:

字符XML 转义
<&lt;
>&gt;
&&amp;
"&quot;
'&apos;

🎨 高级转换技巧#

技巧 1:属性映射#

将 JSON 的某些字段转换为 XML 属性而不是子元素。

JSON:

{
"user": {
"id": "123",
"name": "John",
"email": "john@example.com"
}
}

转换后(id 作为属性):

<user id="123">
<name>John</name>
<email>john@example.com</email>
</user>

实现方式:

  • 使用 @ 前缀标记属性字段
  • 或在转换工具中配置属性映射规则

技巧 2:命名空间处理#

XML 支持命名空间,JSON 不支持。

带命名空间的 XML:

<root xmlns:addr="http://example.com/address">
<addr:city>Beijing</addr:city>
</root>

对应的 JSON:

{
"root": {
"@xmlns:addr": "http://example.com/address",
"addr:city": "Beijing"
}
}

技巧 3:混合内容处理#

XML 支持混合内容(文本 + 子元素),JSON 不支持。

XML 混合内容:

<person>My name is <name>John</name></person>

JSON 表示:

{
"person": {
"#text": "My name is ",
"name": "John"
}
}

📊 实际案例分析#

案例 1:REST API 转 SOAP#

REST API 响应(JSON):

{
"getUserResponse": {
"userId": "123",
"name": "John Doe",
"email": "john@example.com",
"roles": ["admin", "user"]
}
}

转换为 SOAP 格式(XML):

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
<soap:Body>
<getUserResponse>
<userId>123</userId>
<name>John Doe</name>
<email>john@example.com</email>
<roles>
<item>admin</item>
<item>user</item>
</roles>
</getUserResponse>
</soap:Body>
</soap:Envelope>

案例 2:Maven POM.xml 生成#

package.json:

{
"name": "my-app",
"version": "1.0.0",
"dependencies": {
"react": "^18.0.0",
"axios": "^1.0.0"
}
}

转换为 Maven POM.xml:

<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>my-app</artifactId>
<version>1.0.0</version>
<dependencies>
<dependency>
<groupId>org.reactjs</groupId>
<artifactId>react</artifactId>
<version>18.0.0</version>
</dependency>
<dependency>
<groupId>com.axios</groupId>
<artifactId>axios</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
</project>

案例 3:Android 布局文件#

JSON 格式定义:

{
"LinearLayout": {
"@xmlns:android": "http://schemas.android.com/apk/res/android",
"@android:orientation": "vertical",
"@android:layout_width": "match_parent",
"@android:layout_height": "wrap_content",
"TextView": {
"@android:text": "Hello World",
"@android:textSize": "16sp"
}
}
}

转换后的 XML:

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:text="Hello World"
android:textSize="16sp"/>
</LinearLayout>

⚠️ 常见问题与解决方案#

问题 1:数组项标签名不明确#

错误示例:

<users>
<item>...</item>
<item>...</item>
</users>

问题:item 没有语义,不知道代表什么

解决方案:

<users>
<user>...</user>
<user>...</user>
</users>

最佳实践:

  • 使用有意义的标签名
  • 父元素用复数,子元素用单数
  • 遵循 XML Schema 定义

问题 2:数据类型丢失#

JSON:

{
"age": 30, // 数字类型
"active": true // 布尔类型
}

XML:

<age>30</age> // 看起来像字符串
<active>true</active> // 看起来像字符串

问题:XML 中所有值都是字符串,类型信息丢失

解决方案 1:使用 XML Schema:

<xs:element name="age" type="xs:integer"/>
<xs:element name="active" type="xs:boolean"/>

解决方案 2:添加类型属性:

<age type="number">30</age>
<active type="boolean">true</active>

问题 3:深层嵌套导致 XML 过于复杂#

JSON:

{
"company": {
"department": {
"team": {
"member": {
"name": "John"
}
}
}
}
}

转换后:

<company>
<department>
<team>
<member>
<name>John</name>
</member>
</team>
</department>
</company>

问题:嵌套过深,难以阅读和维护

解决方案:

  • 扁平化数据结构
  • 使用 ID 引用
  • 拆分多个 XML 文件

🛠️ 转换工具推荐#

在线工具#

专业 JSON 转 XML 工具:

网址:https://www.xingdian.net/app/json/convert/
功能:
- 实时转换
- 自定义根节点
- 属性映射
- 批量转换

编程语言库#

Node.js:

const convert = require('xml-js');
const json = { name: "John", age: 30 };
const xml = convert.json2xml(JSON.stringify(json));

Python:

import json2xml
data = {"name": "John", "age": 30}
xml = json2xml.Json2xml(data).to_xml()

Java:

import org.json.JSONObject;
import org.json.XML;
String jsonStr = "{\"name\":\"John\"}";
JSONObject json = new JSONObject(jsonStr);
String xml = XML.toString(json);

📈 最佳实践总结#

1. 设计阶段#

  • ✅ 提前规划 XML 结构
  • ✅ 定义清晰的命名规范
  • ✅ 考虑 XML Schema 验证

2. 转换阶段#

  • ✅ 验证 JSON 格式正确性
  • ✅ 处理特殊字符转义
  • ✅ 保留数据类型信息

3. 验证阶段#

  • ✅ 使用 XSD 验证 XML
  • ✅ 检查命名空间
  • ✅ 测试边界情况

4. 维护阶段#

  • ✅ 文档化转换规则
  • ✅ 版本控制转换配置
  • ✅ 定期审查转换结果

💬 总结#

JSON 转 XML 是系统集成和数据交换的常见需求。掌握正确的转换规则可以:

  • ✅ 确保数据准确:正确映射数据类型和结构
  • ✅ 提升转换效率:使用合适的工具和方法
  • ✅ 避免常见错误:了解并预防转换陷阱
  • ✅ 优化数据质量:生成规范的 XML 文档

核心要点:

  1. 理解 JSON 和 XML 的结构差异
  2. 掌握特殊字符转义规则
  3. 合理设计属性映射
  4. 使用工具自动化转换
  5. 始终验证转换结果
相关资源

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

最后更新于 2026-03-29,距今已过 201 天

部分内容可能已过时

公告
🎉 已升级 2.0 版本,欢迎使用。
分类
标签
站点统计
文章
197
分类
24
标签
747
总字数
334,099
运行时长
0 天
最后活动
0 天前

目录