JSON ( JavaScript Object Notation)是一种轻量级数据交换格式, 它基于JavaScript编程 语言的一个子集,于1999年12月成为一个完全独立于语言的文本格式。 由于其格式使用了 其他许多流行编程的约定,如C、C++v c #、Java、JS、Python等, 加之其简单灵活、可读性和互操作性较强、易于解析和使用等特点,逐渐变得流行起来, 甚至有代替XML的趋 势。 关于JSON和XML之间的优劣,一直有很多争论。 此处不对这两者之间的是是非非做分析(笔者的观点是两者各有所长,在相当长的时间里还会共存), 这里关注的是JSON用于序列化方面的优势。
在进行详细讨论之前,先来看看Python语言中对 JSON的支持现状。
Python中有一系列的模块提供对JSON格式的支持,如simplejson、cjson、yajl、ujson, 自 Python2.6后又引入了标准库JSON。 简单来说cjson和ujson是用C来实现的,速度较快。 据 cjson的文挡表述:其速率比纯Python实现的json模块大概要快250倍。 yajl是Cpython版本的 JSON实现,而simplejson和标准库JS0N本质来说无多大区别, 实际上Python2.6中的json模块就是simplejson减去对Python2.4、2,5的支持以充分利用最新的兼容未来的功能。 不过相对 于simplejson,标准库更新相对较慢. Python2.7.5中simplejson对应的版本为2.0.9,而最新的 sirnplejson的版本为3.3.0。
在实际应用过程中将这两者结合较好的做法是采用如下import方法:
try:
import simplejson as json
except ImportError:
import json
本节仍采用标准库JSON来做一些探讨a Python的标准库JSON提供的最常用的方法 与pickle类似, dump/dumps用来序列化,load/loads用来反序列化。需要注意的json默认不支持非ASCII-based的编码, 如load方法可能在处埋中文字符时不能正常显示, 则需要通过 encoding参数指定对应的宇符编码。在序列化方面, 相比pickle, JSON具有以下优势:
- 使用简单,支持多种数据类型JSON文挡的构成非常简单,仅存在以下两大数据结构:
- 名称/值对的集合。在各种语言中, 它被实现为一个对象、记录、结构、字典、散列表、键列表或关联数组。
- 值的有序列表。在大多数语言中,它被实现为数组、向量、列表或序列。 在Python 中对应支持的数据类型包括字典、列表、字符串、整数、浮点数、True、False、None 等。 JSON中数据结构和Python中的转换并不是完全一一对应,存在一定的差异, 读者可以自行査阅文档。
存储格式可读性更为友好.容易修改。相比于pickle来说, json的格式更加接近程序 员的思维, 修改和阅读上要容易得多3 dumpsO函数提供了一个参数indent使生成的jscm文件可读性更好.0意味着“每个值单独一行”; 大于〇的数字意味着“每个值单独一行并且使用 这个数字的空格来缩进嵌套的数据结构”。 但需要注意的是,这个参数是以文件大小变大为代 价的。
json支持跨平台跨语言操作,能够轻易被其他语言解析.如Python中生成的json文件可以轻易使用JavaScript解析, 互操作性更强,而pickle格式的文件只能在Python语言中 支持。 此外json原生的JavaScript支持,客户端浏览器不需要为此使用额外的解释器, 特別适用于Web应用提供快速、紧凑、方便的序列化操作。 此外,相比于pickle, json的茌储格 式更为紧凑,所占空间更小。 下图为pickle和json文件格式对比。
具有较强的扩展性
json模块还提供了编码(JSONEncoder)和解码类(JSONDecoder) 以便用户对其默认不支持的序列化类型进行扩展。来看一个例子:
import datetime
d=datetime.datetime.now()
d
datetime.datetime(2025, 4, 29, 1, 19, 19, 289858)
import json
# json.dumps(d) #此代码会报错
json在序列化datetime的时候会抛出TypeError异常, 这是因为 Json 模块本身不支持 dateline的序列化, 因此需要对json本身的JSONEncoder进行扩展。 有多种方法可以实现,下面的例子是其中实现之一。
import datetime
from time import mktime
try:
import simplejson as json
except ImportError:
import json
对 JSONEnccKier 进行扩展。
class DateTiraeEncoder (json.JSONEncoder) :
def default(self,obj):
if isinstance(obj, datetime.datetime):
return obj.strftime('%Y-%m-%d %H:%M:%S')
elif isinstance(obj, date):
return json.JSONEncoder.default(self,obj)
d=datetime.datetime.now ()
print (json.dumps(d,cls=DateTiraeEncoder))
"2025-04-29 01:19:19"
最后需要提醒的是,Python中标准模块 json
的性能比 pickle 与 cPickle 稍逊。
如果对序列化性能要求非常高的场景,可以选择 cPickle 模块。
下图显示的是这三者序列化时随着数 据规模增加所消耗时间改变的图例。
什么是SimpleJSON?
SimpleJSON是一个独立且开源的Python JSON库。它支持Python 2.6及更高版本, 包括Python 3.x系列。该项目的目标是提供一个快速、稳定、易于使用的JSON解析器和生成器。
用途
SimpleJSON可以帮助开发人员在Python应用中轻松地对JSON数据进行编码和解码操作。 以下是SimpleJSON的一些主要用途:
- 序列化Python对象为JSON字符串:
使用
dumps()
函数将Python字典、列表和其他类型的数据转换成JSON格式的字符串。 - 反序列化JSON字符串为Python对象:
使用
loads()
函数将JSON格式的字符串解析为Python字典或列表等数据结构。 - 自定义序列化和反序列化行为: SimpleJSON允许通过注册自定义的序列化和反序列化函数来扩展其功能,以满足特定需求。
- 高性能: 相比Python内置的json模块, SimpleJSON具有更高的性能,在某些场景下可以显著提高代码运行速度。
特点
- 兼容标准库:SimpleJSON与Python自带的json模块高度兼容,可以直接替换大部分应用场景下的json模块使用。
- 性能优化:SimpleJSON针对Python的特性和性能进行了优化,使其在大多数情况下都能获得更快的速度。
- 跨平台:适用于各种Python环境,包括CPython(官方实现)和Jython(基于Java的Python实现)。
- 易用性:与json模块类似的API设计,使得开发人员能够快速上手并开始使用。
- 丰富的文档:详细的文档说明了如何使用SimpleJSON及其各种特性。
安装
要安装SimpleJSON,可以通过pip执行以下命令:
# pip install simplejson
!which python3
/opt/conda/bin/python3
import simplejson as json
data = {
"name": "Alice",
"age": 30,
"languages": ["Python", "JavaScript"]
}
json_str = json.dumps(data)
print(json_str)
{"name": "Alice", "age": 30, "languages": ["Python", "JavaScript"]}
parsed_data = json.loads(json_str)
print(parsed_data)
{'name': 'Alice', 'age': 30, 'languages': ['Python', 'JavaScript']}
如果您正在寻找一种高效、可靠的JSON库来处理Python中的JSON数据, 那么是一个非常值得尝试的选择。凭借其出色的性能、广泛的兼容性和易用的接口, SimpleJSON已成为许多Python开发人员的首选JSON库。