JSON介绍
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使JSON成为理想的数据交换语言。
引用自json.org
语法
结构
JSON只提供了两种结构——字典和数组。也就是说,JSON可以存储一对一或者一对多的键值对关系。
形式
对象
对象是一个无序的键值对集合。
一个对象以{
开始,}
结束。每个键
后跟一个:
;键值对之间使用,
分隔。
数组
数组是值的有序集合,一个键可以对应一个数组。
一个数组以[
开始,]
结束。值之间使用,
分隔。
值
值可以是双引号括起来的字符串、数值、true、false、 null、对象或者数组。这些结构可以嵌套。
字符串
字符串是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符即一个单独的字符串。 字符串与C/C++中的字符串非常相似,包括常见的各种转义符号。
数值
数值与C/C++中的数值非常相似,但没有八进制和十六进制格式。
空白
空白符号(包括空格,Tab以及回车)可以加入到任何符号之间,不会影响JSON的含义
Python中的JSON库
以Python 3为基准
编码
对应类型
Python | JSON |
---|---|
dict | object |
list, tuple | array |
str | string |
int, float | number |
True | true |
False | false |
None | null |
函数
我们使用JSON
库中的dump
以及dumps
函数来进行JSON
编码。dump
和dumps
各项参数含义基本一致,唯一区别在于dump
函数编码产生一个JSON文件流,而dumps
编码产生一个JSON字符串。
json.dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
obj
:编码对象fp
:指定文件流skipkeys
:若skipkeys为真,则非标准类型将会跳过;否则返回TypeError
ensure_ascii
:若ensure_ascii
为真,则输出时将会确保没有非ASCII字符;否则将会原样输出check_circular
:若check_circular
为真,则将会检测是否存在循环调用;否则会跳过检测allow_nan
:若allow_nan
为真,则将会允许存在空值(无穷大值);否则会返回ValueError
cls
:若cls
为空值,则使用JSONEncoder
;否则使用指定子类进行编码indent
:若indent
为空值,则无缩进;否则使用指定值进行缩进separators
:若separators
为空值,则使用(',', ': ')
分隔;否则使用指定的元组进行分隔default
:若default
为空值,则使用自带的default
方法;否则使用指定值sort_keys
:若sort_keys
为真,则输出将会按照键进行排序
示范
>>> import json
>>> json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])
'["foo", {"bar": ["baz", null, 1.0, 2]}]'
# 排序
>>> print(json.dumps({"c": 0, "b": 0, "a": 0}, sort_keys=True))
{"a": 0, "b": 0, "c": 0}
# 分隔符
>>> json.dumps([1,2,3,{'4': 5, '6': 7}], separators=(',', ':'))
'[1,2,3,{"4":5,"6":7}]'
# Unicode输出
>>> json.dumps("\u5317\u4eac", ensure_ascii=False)
'北京'
解码
对应类型
JSON | Python |
---|---|
object | dict |
array | list |
string | str |
number (int) | int |
number (real) | float |
true | True |
false | False |
null | None |
函数
我们使用JSON
库中的load
以及loads
函数来进行JSON
解码。load
和loads
各项参数含义基本一致,唯一区别在于load
函数用于解码JSON文件流,而loads
用于解码JSON字符串。
json.load(fp, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
json.loads(s, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
fp
:指定文件流s
:指定字符串encoding
:指定字符串编码cls
:若cls
为空值,则使用JSONEncoder
;否则使用指定子类进行编码object_hook
:若object_hook
为空值,对象则返回解码器dict
;否则使用自定义类型返回parse_float
:若parse_float
为空,则JSON浮点数转换为浮点数;否则转换为指定类型parse_int
:若parse_int
为空,则JSON整数转换为整数;否则转换为指定类型parse_constant
若parse_constant
为空,则不会处理非法输入;否则抛出异常object_pairs_hook
:若object_pairs_hook
为空值,则数组返回解码器dict
;否则使用自定义类型返回
示范
>>> import json
>>> json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]')
['foo', {'bar': ['baz', None, 1.0, 2]}]
更新日志
- 2015年10月30日 初步完成