json 的数据类型与python的数据类型对应(映射)表
编码: python的数据类型 --> json的数据类型
python | json |
---|---|
dict | object |
list,tuple | array |
str,unicode | string |
int,long,float | number |
True | ture |
False | false |
None | null |
解码: json的数据类型 --> python的数据类型
json | python |
---|---|
object | dict |
array | list |
string | str |
number(int) 整数 | int |
number(real)非整数 | float |
ture | True |
false | False |
null | None |
json 的常用方法
1. json.dumps()
将 Python 对象编码成 JSON 字符串
对象–>字符串
语法
json.dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True,
allow_nan=True, cls=None, indent=None, separators=None, encoding="utf-8",
default=None, sort_keys=False, **kw)
参数介绍
参数 | 作用 | 官网介绍 |
---|---|---|
obj | python对象 | |
skipkeys | 如果为True的话,则只能是字典对象,否则会TypeError错误, 默认False | 如果 skipkeys 是 true (默认为 False),那么那些不是基本对象(包括 str, int、float、bool、None)的字典的键会被跳过;否则引发一个 TypeError。 |
ensure_ascii | 确定是否为ASCII编码 | 如果 ensure_ascii 是 true (即默认值),输出保证将所有输入的非 ASCII 字符转义。如果 ensure_ascii 是 false,这些字符会原样输出 |
check_circular | 循环类型检查,如果为True的话 | 如果 check_circular 是为假值 (默认为 True),那么容器类型的循环引用检验会被跳过并且循环引用会引发一个 OverflowError (或者更糟的情况) |
allow_nan | 确定是否为允许的值 | 如果 allow_nan 是 false(默认为 True),那么在对严格 JSON 规格范围外的 float 类型值(nan、inf 和 -inf)进行序列化时会引发一个 ValueError。如果 allow_nan 是 true,则使用它们的 JavaScript 等价形式(NaN、Infinity 和 -Infinity)。 |
cls | 为了使用一个自定义的 JSONEncoder 子类(比如:覆盖了 default() 方法来序列化额外的类型), 通过 cls 关键字参数来指定;否则将使用 JSONEncoder。在 3.6 版更改: 所有的可选参数现在是 keyword-only 的了 | |
indent | 会以美观的方式来打印,呈现,实现缩进 | 如果 indent 是一个非负整数或者字符串,那么 JSON 数组元素和对象成员会被美化输出为该值指定的缩进等级。如果缩进等级为零、负数或者 “”,则只会添加换行符。None(默认值)选择最紧凑的表达。使用一个正整数会让每一层缩进同样数量的空格。如果 *indent* 是一个字符串(比如 "\t"),那个字符串会被用于缩进每一层。在 3.2 版更改: 允许使用字符串作为 indent 而不再仅仅是整数。 |
separators | 对象分隔符,默认为, | 当指定时,separators 应当是一个 (item_separator, key_separator) 元组。当 indent 为 None 时,默认值取 (’, ‘, ‘: ‘),否则取 (’,’, ‘: ‘)。为了得到最紧凑的 JSON 表达式,你应该指定其为 (’,’, ‘:’) 以消除空白字符。在 3.4 版更改: 现当 indent 不是 None 时,采用 (’,’, ': ') 作为默认值。 |
encoding | 编码方式,默认为utf-8 | |
default | 当 default 被指定时,其应该是一个函数,每当某个对象无法被序列化时它会被调用。它应该返回该对象的一个可以被 JSON 编码的版本或者引发一个 TypeError。如果没有被指定,则会直接引发 TypeError。 | |
sort_keys | 如果是字典对象,选择True的话,会按照键的ASCII码来排序 | 如果 sort_keys 是 true(默认为 False),那么字典的输出会以键的顺序排序。 |
2. json.loads()
将已编码的 JSON 字符串解码为 Python 对象
字符串转对象
语法
json.loads(s, *, encoding=None, cls=None, object_hook=None, parse_float=None,
parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
3. json.dump()
将Python内置类型序列化为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)
4. json.load()
读取文件中json形式的字符串元素转化为Python类型
语法
json.load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None,
parse_constant=None, object_pairs_hook=None, **kw)
更多介绍查看官网文档
一些代码参考
对基本的 Python 对象层次结构进行编码
>>> import json
>>> json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])
'["foo", {"bar": ["baz", null, 1.0, 2]}]'
>>> print(json.dumps("\"foo\bar"))
"\"foo\bar"
>>> print(json.dumps('\u1234'))
"\u1234"
>>> print(json.dumps('\\'))
"\\"
>>> print(json.dumps({"c": 0, "b": 0, "a": 0}, sort_keys=True))
{"a": 0, "b": 0, "c": 0}
>>> from io import StringIO
>>> io = StringIO()
>>> json.dump(['streaming API'], io)
>>> io.getvalue()
'["streaming API"]'
紧凑编码:
>>> import json
>>> json.dumps([1, 2, 3, {'4': 5, '6': 7}], separators=(',', ':'))
'[1,2,3,{"4":5,"6":7}]'
美化输出:
>>> import json
>>> print(json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4))
{
"4": 5,
"6": 7
}
JSON解码:
>>> import json
>>> json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]')
['foo', {'bar': ['baz', None, 1.0, 2]}]
>>> json.loads('"\\"foo\\bar"')
'"foo\x08ar'
>>> from io import StringIO
>>> io = StringIO('["streaming API"]')
>>> json.load(io)
['streaming API']
特殊JSON对象解码:
>>> import json
>>> def as_complex(dct):
... if '__complex__' in dct:
... return complex(dct['real'], dct['imag'])
... return dct
...
>>> json.loads('{"__complex__": true, "real": 1, "imag": 2}',
... object_hook=as_complex)
(1+2j)
>>> import decimal
>>> json.loads('1.1', parse_float=decimal.Decimal)
Decimal('1.1')
扩展 JSONEncoder:
>>> import json
>>> class ComplexEncoder(json.JSONEncoder):
... def default(self, obj):
... if isinstance(obj, complex):
... return [obj.real, obj.imag]
... # Let the base class default method raise the TypeError
... return json.JSONEncoder.default(self, obj)
...
>>> json.dumps(2 + 1j, cls=ComplexEncoder)
'[2.0, 1.0]'
>>> ComplexEncoder().encode(2 + 1j)
'[2.0, 1.0]'
>>> list(ComplexEncoder().iterencode(2 + 1j))
['[2.0', ', 1.0', ']']
从命令行使用 json.tool 来验证并美化输出:
$ echo '{"json":"obj"}' | python -m json.tool
{
"json": "obj"
}
$ echo '{1.2:3.4}' | python -m json.tool
Expecting property name enclosed in double quotes: line 1 column 2 (char 1)