如何解析JSON格式和XML格式:从基础到实践的全面指南
在当今数据驱动的时代,JSON(JavaScript Object Notation)和XML(eXtensible Markup Language)是两种最常见的数据交换格式,无论是Web API的响应、配置文件的存储,还是跨系统数据传输,这两种格式都扮演着重要角色,理解如何高效解析它们,是开发者必备的技能,本文将从基础概念出发,详细解析JSON和XML的格式特点、解析方法(包括手动解析与工具解析),并通过代码示例带你快速上手。
JSON格式解析:轻量级数据的“通用语言”
1 JSON是什么?
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,以“键值对”(Key-Value Pair)为核心结构,易于人阅读和编写,也易于机器解析和生成,它基于JavaScript的一个子集,但已成为独立于语言的数据格式(几乎所有编程语言都支持JSON处理)。
JSON基本结构:
- 对象(Object):用 表示,无序的键值对集合,键必须是字符串(需用双引号包围),值可以是字符串、数字、布尔值、数组、对象或null,键值对用逗号分隔。
示例:{"name": "张三", "age": 30, "isStudent": false} - 数组(Array):用
[]表示,有序的值集合,值可以是任意JSON支持的类型,元素用逗号分隔。
示例:["apple", "banana", {"color": "red"}]
2 JSON解析方法
JSON的解析核心是将“文本字符串”转换为“程序中的数据结构”(如Python的字典/列表、Java的对象/Map等),以下是主流语言的解析实践:
(1)Python:json模块,一行代码搞定
Python内置json模块,提供loads()(字符串转对象)和load()(文件流转对象)方法。
import json
# JSON字符串
json_str = '{"name": "李四", "hobbies": ["reading", "coding"], "address": null}'
# 解析为Python字典/列表
data = json.loads(json_str)
print(data["name"]) # 输出: 李四
print(data["hobbies"][0]) # 输出: reading
# 从JSON文件解析(假设文件为data.json)
# with open("data.json", "r", encoding="utf-8") as f:
# file_data = json.load(f)
(2)JavaScript:原生API与JSON对象
JavaScript作为JSON的“起源语言”,原生支持JSON解析,无需额外库。
// JSON字符串
const jsonStr = '{"name": "王五", "age": 25, "skills": ["JavaScript", "Python"]}';
// 解析为JavaScript对象
const data = JSON.parse(jsonStr);
console.log(data.name); // 输出: 王五
console.log(data.skills[1]); // 输出: Python
// 对象转JSON字符串(序列化)
const jsonString = JSON.stringify(data, null, 2); // 缩进2格,美化输出
console.log(jsonString);
(3)Java:Gson与Jackson库
Java本身没有内置JSON解析,但主流库如Gson(Google)、Jackson(Spring框架默认)可轻松处理。
使用Gson:
import com.google.gson.Gson;
public class JsonParse {
public static void main(String[] args) {
String jsonStr = "{\"name\": \"赵六\", \"score\": 90.5}";
Gson gson = new Gson();
// 解析为Java对象(需定义对应类)
Student student = gson.fromJson(jsonStr, Student.class);
System.out.println(student.name + ": " + student.score);
}
}
class Student {
String name;
double score;
}
// 输出: 赵六: 90.5
3 JSON解析注意事项
- 键名必须双引号:单引号会导致解析错误(如
{'name': '张三'}是非法JSON)。 - 值类型需匹配:如数字不能加引号(
"age": "30"是字符串,"age": 30才是数字)。 - 避免注释:JSON标准不支持注释,需通过外部工具或预处理添加。
XML格式解析:结构化数据的“老牌选手”
1 XML是什么?
XML(eXtensible Markup Language)是一种标记语言,用于“描述数据”而非“展示数据”,它通过自定义标签(如 <name>、<age>)定义数据结构,具有严格的语法规则,常用于配置文件(如Java的web.xml)、文档存储和跨企业数据交换。
XML基本结构:
- 文档声明:
<?xml version="1.0" encoding="UTF-8"?>(必须放在第一行)。 - 根元素:唯一且必须,如
<users>。 - 子元素与属性:通过嵌套标签表示层级关系,属性通过键值对附加在标签上(如
<user id="1">)。 - 注释:
<!-- 这是注释 -->。
示例:
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student id="001">
<name>陈七</name>
<age>20</age>
<courses>
<course>数学</course>
<course>英语</course>
</courses>
</student>
<student id="002">
<name>周八</name>
<age>21</age>
<courses>
<course>物理</course>
</courses>
</student>
</students>
2 XML解析方法
XML解析的核心是“读取标签层级并提取数据”,主流解析方式分为DOM解析(Document Object Model,将整个XML加载到内存,树形结构操作)和SAX解析(Simple API for XML,事件驱动,逐行读取,内存占用低),以下是具体实践:
(1)Python:xml.etree.ElementTree模块
Python内置ElementTree模块,支持DOM和SAX风格解析,适合中小型XML文件。
import xml.etree.ElementTree as ET
# XML字符串
xml_str = """
<students>
<student id="001">
<name>陈七</name>
<age>20</age>
</student>
<student id="002">
<name>周八</name>
<age>21</age>
</student>
</students>
"""
# 解析为ElementTree对象
root = ET.fromstring(xml_str)
# 遍历所有student标签
for student in root.findall("student"):
name = student.find("name").text
age = student.find("age").text
id = student.get("id") # 获取属性
print(f"ID: {id}, 姓名: {name}, 年龄: {age}")
# 从XML文件解析(假设文件为students.xml)
# tree = ET.parse("students.xml")
# root = tree.getroot()
(2)Java:DOM与SAX解析
Java原生提供javax.xml.parsers包支持XML解析,同时DOM4J(第三方库)因更高效易用而流行。
使用DOM解析(原生):
import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.io.StringReader;
public class XmlDomParse {
public static void main(String[] args) throws Exception {
String xmlStr = "<students><student id='001'><name>陈七</name><age>20</age></student></students>";
// 创建DOM解析器
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
// 解析XML字符串
Document document = builder.parse(new InputSource(new StringReader(xmlStr)));
document.getDocumentElement().normalize();
// 获取所有student节点
NodeList nodeList = document.getElementsByTagName("student");
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element element = (Element) node;
String id = element.getAttribute("id");
String name = element.getElementsByTagName("name").item(0).getTextContent();
String age = element.getElementsByTagName("age").item(0).getTextContent();
System.out.println("ID: " + id + ", 姓名: " + name + ", 年龄: " + age);
}
}
}
}
使用DOM4J(推荐):
import org.dom4j.*;
import org.dom4j.io.SAXReader;
import java.io.StringReader;
import java.util.List;
public class XmlDom4jParse {
public static void main(String[]


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