核心要点(请务必先看)
python-demjson 是一个比较老的库,用于解析不符合严格 JSON 标准的“畸形” JSON 字符串,在现代 Python 开发中,强烈推荐使用内置的 json 模块,因为它更快、更标准,并且是 Python 的一部分。
仅在以下特定情况下,才需要考虑使用 python-demjson:
- 你需要处理的 JSON 字符串包含单引号 () 而不是双引号 ()。
- JSON 字符串中包含尾随逗号 (
[1, 2, 3,])。 - JSON 的键名没有使用引号(
{name: "John"})。
如果你的数据是标准 JSON,请直接使用 json 模块。
安装 python-demjson
python-demjson 可以通过 Python 的包管理器 pip 轻松安装。
步骤 1:打开终端或命令提示符
- Windows: 打开 "命令提示符" (CMD) 或 "PowerShell"。
- macOS / Linux: 打开 "终端" (Terminal)。
步骤 2:使用 pip 安装
在终端中输入以下命令并按回车:
pip install demjson
输出示例:
Collecting demjson
Downloading demjson-0.8.0-py2.py3-none-any.whl (15 kB)
Installing collected packages: demjson
Successfully installed demjson-0.8.0
如果安装成功,就说明 python-demjson 已经准备好了。
如何使用 python-demjson
安装完成后,你就可以在 Python 代码中导入并使用它了。
主要功能
demjson 主要提供两个核心类:decode 和 encode。
decode(): 将非标准的 JSON 字符串转换为 Python 对象(如字典、列表)。encode(): 将 Python 对象转换为标准的 JSON 字符串。
示例代码
下面是一个完整的示例,展示了 demjson 如何处理标准 json 模块无法解析的“畸形” JSON。
import json
import demjson
# 1. 定义一个“畸形”的 JSON 字符串
# 它包含了单引号、尾随逗号和无引号的键
non_standard_json_string = """
{
name: '张三',
age: 30,
hobbies: ['编程', '阅读',],
is_student: false
}
"""
print("--- 原始字符串 ---")
print(non_standard_json_string)
print("-" * 20)
# 2. 尝试使用标准 json 模块解析 (这会失败)
print("--- 尝试使用标准 json 模块解析 ---")
try:
data_with_json = json.loads(non_standard_json_string)
except json.JSONDecodeError as e:
print(f"解析失败!错误信息: {e}")
print("-" * 20)
# 3. 使用 demjson 解析 (这会成功)
print("--- 使用 demjson 解析 ---")
try:
# 使用 demjson.decode() 进行解析
data_with_demjson = demjson.decode(non_standard_json_string)
print("解析成功!")
print("解析后的 Python 对象:")
print(data_with_demjson)
print(f"类型: {type(data_with_demjson)}")
print("-" * 20)
# 4. 将解析后的对象重新编码为标准 JSON
print("--- 使用 demjson.encode() 重新编码 ---)
standard_json_output = demjson.encode(data_with_demjson)
print("重新编码后的标准 JSON 字符串:")
print(standard_json_output)
print(f"类型: {type(standard_json_output)}")
except demjson.JSONDecodeError as e:
print(f"demjson 解析失败!错误信息: {e}")
运行结果:
--- 原始字符串 ---
{
name: '张三',
age: 30,
hobbies: ['编程', '阅读',],
is_student: false
}
--------------------
--- 尝试使用标准 json 模块解析 ---
解析失败!错误信息: Expecting property name enclosed in double quotes: line 2 column 5 (char 6)
--------------------
--- 使用 demjson 解析 ---
解析成功!
解析后的 Python 对象:
{'name': '张三', 'age': 30, 'hobbies': ['编程', '阅读'], 'is_student': False}
类型: <class 'dict'>
--------------------
--- 使用 demjson.encode() 重新编码 ---
重新编码后的标准 JSON 字符串:
{"name": "张三", "age": 30, "hobbies": ["编程", "阅读"], "is_student": false}
类型: <class 'str'>
重要对比:json vs demjson
| 特性 | json (Python 内置) |
demjson (第三方库) |
|---|---|---|
| 标准遵循 | 严格遵循 RFC 8259 JSON 标准 | 宽松,能容忍单引号、尾随逗号等“畸形”语法 |
| 性能 | 非常快,因为它是 C 语言实现的内置模块 | 相对较慢,因为是纯 Python 实现 |
| 依赖 | 无需安装,是 Python 标准库的一部分 | 需要通过 pip install 安装 |
| 推荐场景 | 99% 的情况,特别是处理 API 响应、配置文件等标准 JSON | 处理来源不可控、格式不严格的“半 JSON”文本,如某些网页数据或旧系统输出 |
- 安装:
pip install demjson - 用途: 专门用于解析非标准的 JSON 字符串。
- 优先级: 优先使用 Python 内置的
json模块,只有在遇到json模块无法解析的数据时,再考虑使用demjson。 - 注意:
demjson的decode()方法是解析的核心,而encode()方法用于将 Python 对象转换回标准 JSON。
