XML 转 JSON:实用方法与工具指南
在数据交互的世界里,XML(可扩展标记语言)和JSON(JavaScript 对象表示法)是两种常见的数据格式,XML 曾因可扩展性和结构化特性广泛应用于企业级系统,而 JSON 以轻量级、易解析的优势成为 Web 开发的主流格式,当需要将 XML 数据集成到现代应用(如前后端分离项目、移动端 API)时,XML 转 JSON 成为一项高频需求,本文将详细介绍 XML 转 JSON 的核心方法、工具选择及注意事项,帮助你高效完成格式转换。
理解 XML 与 JSON 的结构差异
在转换前,先明确两者的核心区别,这有助于理解转换逻辑:
- XML:基于标签的树状结构,通过开始标签(如
<name>)、结束标签(如</name>)和属性(如<person id="1">)描述数据,支持注释(<!-- -->)和 CDATA 段(<![CDATA[]]>)。 - JSON:基于键值对的轻量级结构,使用 表示对象、
[]表示数组、"key": value表示数据项(值可以是字符串、数字、布尔值、null 或嵌套对象/数组),不支持注释和属性(属性需转为键值对)。
以下 XML 数据:
<person id="1">
<name>张三</name>
<age>25</age>
<hobbies>
<hobby>阅读</hobby>
<hobby>编程</hobby>
</hobbies>
<address city="北京" district="海淀区"/>
</person>
对应的 JSON 格式为:
{
"person": {
"id": "1",
"name": "张三",
"age": 25,
"hobbies": ["阅读", "编程"],
"address": {
"city": "北京",
"district": "海淀区"
}
}
}
XML 转 JSON 的核心方法
编程语言实现:灵活可控,适合定制化需求
(1)Python:使用 xmltodict 或 json 库
Python 是处理数据转换的利器,xmltodict 库能将 XML 直接转为字典(JSON 的基础),再通过 json 序列化为 JSON 字符串。
安装依赖:
pip install xmltodict
转换代码:
import xmltodict
import json
# XML 字符串
xml_data = """
<person id="1">
<name>张三</name>
<age>25</age>
<hobbies>
<hobby>阅读</hobby>
<hobby>编程</hobby>
</hobbies>
<address city="北京" district="海淀区"/>
</person>
"""
# 转换为字典
dict_data = xmltodict.parse(xml_data)
# 序列化为 JSON(ensure_ascii=False 确保中文正常显示)
json_data = json.dumps(dict_data, ensure_ascii=False, indent=2)
print(json_data)
输出结果:
{
"person": {
"@id": "1", # XML 属性转为 "@属性名" 键
"name": "张三",
"age": 25,
"hobbies": {
"hobby": [
"阅读",
"编程"
]
},
"address": {
"@city": "北京",
"@district": "海淀区"
}
}
}
关键点:
- XML 属性默认添加 前缀(如
id="1"→"@id": "1"),可通过attr_prefix=False禁用(但不推荐,可能造成键冲突)。 - 重复标签(如
<hobby>)会被转为数组(["阅读", "编程"])。
(2)JavaScript:使用 xml2js 库(Node.js)或浏览器 API
前端或 Node.js 开发中,xml2js 是常用的 XML 解析库。
安装依赖:
npm install xml2js
转换代码(Node.js):
const xml2js = require('xml2js');
// XML 字符串
const xmlData = `
<person id="1">
<name>张三</name>
<age>25</age>
<hobbies>
<hobby>阅读</hobby>
<hobby>编程</hobby>
</hobbies>
</person>
`;
// 解析配置(explicitChildren 处理子节点,emptyTag 处理空标签)
const parser = new xml2js.Parser({ explicitChildren: true, emptyTag: '' });
const builder = new xml2js.Builder();
parser.parseString(xmlData, (err, result) => {
if (err) throw err;
// 转换为 JSON 字符串
const jsonData = JSON.stringify(result, null, 2);
console.log(jsonData);
});
输出结果:
{
"person": {
"$": { "id": "1" }, // 属性转为 "$" 对象
"name": ["张三"], // 值默认转为数组(可通过 explicitArray: false 禁用)
"age": ["25"],
"hobbies": {
"hobby": ["阅读", "编程"]
}
}
}
(3)Java:使用 Jackson 或 Gson
Java 中可通过 Jackson 的 XmlMapper 或 Gson 的 JsonParser 实现,推荐 Jackson(更高效)。
添加依赖(Maven):
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.13.0</version>
</dependency>
转换代码:
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
public class XmlToJsonConverter {
public static void main(String[] args) throws Exception {
String xmlData = """
<person id="1">
<name>张三</name>
<age>25</age>
</person>
""";
XmlMapper xmlMapper = new XmlMapper();
ObjectMapper jsonMapper = new ObjectMapper();
// XML 转 Java 对象
Object obj = xmlMapper.readValue(xmlData, Object.class);
// Java 对象转 JSON
String jsonData = jsonMapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj);
System.out.println(jsonData);
}
}
输出结果:
{
"person" : {
"@id" : "1",
"name" : "张三",
"age" : 25
}
}
在线工具:快速转换,适合临时需求
若无需编程,可使用在线工具直接转换,适合小数据量或临时测试:
- FreeFormatter XML to JSON Converter:支持拖拽上传,实时预览,可配置属性前缀。
- Code Beautify XML to JSON:支持批量转换,提供转换选项(如是否忽略空格、是否格式化)。
- W3Schools XML to JSON:简单易用,适合基础格式转换。
使用场景:快速验证转换结果、处理一次性数据转换,但需注意敏感数据勿上传公开平台。
命令行工具:自动化处理,适合批量任务
若需批量转换 XML 文件(如日志处理、数据迁移),命令行工具更高效:
(1)xsltproc(Linux/macOS 自带)
通过 XSLT 样式表定义转换规则,将 XML 转为 JSON(需先编写 XSLT)。
示例 XSLT(convert.xslt):
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" indent="no"/>
<xsl:template match="/">
<xsl:text>{</xsl:text>
<xsl:for-each select="*">
<xsl:if test="position() > 1"><xsl:text>,</xsl:text></xsl:if>
<xsl:text>"</xsl:text><xsl:value-of select="name()"/><xsl:text>":</xsl:text>
<xsl:choose>
<xsl:when test="@*">
<xsl:text>{</xsl:text>
<xsl:for-each select="@*">
<xsl:if test="position() > 1"><xsl:text>,</xsl:text></xsl:if>
<xsl:text>"@</xsl:text><xsl:value-of select="name()"/><xsl:text>":</xsl:text>
<xsl:value-of select="concat('"', .


还没有评论,来说两句吧...