json函数
使用json函数之前,首先需要导入json模块,import json
JSON 的规定字符集是UTF-8,字符串必须使用""双引号,Object的键也必须使用双引号,不能使用单引号;
JSON格式的数组或者对象中,不同的元素用逗号隔开,最后一个元素后面,不能加逗号。
python数据类型与json数据类型的映射关系
python | python |
---|---|
dict | object |
list, tuple | array |
str, unicode | string |
int, long, float | number |
True | true |
False | false |
None | null |
json转换为python
Python中的list和tuple都被转化成json的数组,而解码后,json的数组最终被转化成Python的list的,无论是原来是list还是tuple。
json中常用的方法
方法 | 描述 |
---|---|
json.dumps() | 将 Python 对象编码成 JSON 字符串 |
json.loads() | 将已编码的 JSON 字符串解码为 Python 对象 |
json.dump() | 将Python内置类型序列化为json对象后写入文件 |
json.load() | 读取文件中json形式的字符串元素转化为Python类型 |
JSON可以表示四种主类型数据
- 字符串 string
- 数字 number
- 布尔类 boolean
- 空值 null
以及两结数据结构
- 对象 object
- 数组 array
>>> import json
>>> json.dumps({1:'a',2:'b'})#python的字典转换为json的对象
'{"1": "a", "2": "b"}'#1和2都加了双引号的,因为json的名称是必须要加双引号的
>>> json.dumps([1,2,3])#python的列表转换为json的数组
'[1, 2, 3]'
>>> json.dumps((1,2,3,'a'))#python的元祖转换为json的数组
'[1, 2, 3, "a"]'#注意此时显示的是方括号
>>> json.dumps('abdcs')#python的字符串转换为json的字符串
'"abdcs"'
>>> json.dumps(u'a')#python的unicode字符串转换为json的字符串
'"a"'
>>> json.dumps(13)#python的整数转换为json的数字
'13'
>>> json.dumps(3.1415)#python的浮点数转换为json的数字
'3.1415'
>>> json.dumps(True)#python的True转换为json的数组true
'true'
>>> json.dumps(False)#python的False转换为json的数组false
'false'
>>> json.dumps(None)#python的None转换为json的null
'null'
#json本质上是一个字符串
>>> type(json.dumps([1,2,3,4]))
<class 'str'>
>>> import json
>>> data=[1,2,3,4]
>>> data_json=(1,2,3,4)
>>> json.dumps(data)
'[1, 2, 3, 4]'
>>> json.dumps(data_json)
'[1, 2, 3, 4]'
>>> a=json.dumps(data)
>>> b=json.dumps(data_json)
>>> json.loads(a)
[1, 2, 3, 4]
>>> json.loads(b)
[1, 2, 3, 4]
#元组和列表解析出来的均是数组。
#coding=utf-8
#coding=utf-8
import json
a = [{1:12, 'a':12.3}, [1,2,3], (1,2), 'asd',13, 3.3, True, False, None]
b=json.dumps(a)
c=json.loads(b)
print(u"编码前\n", a)
print(u"编码后\n", b)
print(u"解码后\n", c)
for i in range(len(c)):
print(type(c[i]),end='')
运行之后:
编码前
[{1: 12, 'a': 12.3}, [1, 2, 3], (1, 2), 'asd', 13, 3.3, True, False, None]
编码后
[{"1": 12, "a": 12.3}, [1, 2, 3], [1, 2], "asd", 13, 3.3, true, false, null]
解码后
[{'1': 12, 'a': 12.3}, [1, 2, 3], [1, 2], 'asd', 13, 3.3, True, False, None]#解码后字典里面键1变成加引号,,元组变成了列表
<class 'dict'><class 'list'><class 'list'><class 'str'><class 'int'><class 'float'><class 'bool'><class 'bool'><class 'NoneType'>
import json
data = {
'nanbei':'haha',
'a':[1,2,3,4],
'b':(1,2,3)
}
with open('json_test.txt','w+') as f:
json.dump(data,f)#在当前文件夹创建一个json_test.txt,将json.dump(data)写入f
with open('json_test.txt','r+') as f:
print(json.load(f))
#运行之后{'nanbei': 'haha', 'a': [1, 2, 3, 4], 'b': [1, 2, 3]}
对于JSON中数字number类型的数据
- JSON中的实数real number类型的精度不能超过Python中的float类型的精度范围, 否则就有精度损失. 如下例:
>>> json.loads('3.141592653589793238462643383279')
3.141592653589793
- JSON标准不包括非数字NaN, 正无穷Infinity和负无穷-Infinity
但是json.loads方法默认会将JSON字符串中的NaN, Infinity, -Infinity转化为Python中的float(‘nan’), float(‘inf’)和float(’-inf’). 注意, 这里JSON中的NaN, Infinity, -Infinity必须大小写正确并且拼写完整.
>>> json.loads('{"inf": Infinity, "nan": NaN, "ninf": -Infinity}')
{'inf': inf, 'nan': nan, 'ninf': -inf}
bytes和bytearray数据
>>> json.loads('{"a": 123}'.encode('UTF-8'))
{'a': 123}
>>> json.loads(bytearray('{"a": 123}', 'UTF-8'))
{'a': 123}
由于Python 3中str类型总是使用UTF-8编码, 所以s参数为str类型时, json.loads方法自动使用UTF-8编码. 并且, str不能以BOM字节开头.
当s参数为bytes或者bytearray时, json.loads方法会自动判断为UTF-8, UTF-16还是UTF-32编码. 默认也是将其按照UTF-8编码转化为str对象进行后续处理.
json.dumps()函数参数的使用
help(‘json.dumps’)
son.dumps = 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)
help(‘json.dump’)
json.dump = 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)
将“obj”序列化为JSON格式的流到“fp”(a .write()
-支持类似文件的对象)。
函数作用: 将Python的对象转变成JSON对象
- skipkeys: 如果为True的话,则只能是字典对象,否则会TypeError错误, 默认False,shipkeys可以跳过那些非string对象的key的处理,就是不处理。
- ensure_ascii: 确定是否为ASCII编码,默认是True,表示使用ascii码进行编码。如果设置为False,就会以Unicode进行编码。由于解码json字符串时返回的就是Unicode字符串,所以可以直接操作Unicode字符,然后直接编码Unicode字符串,这样会简单些
- check_circular: 循环类型检查,如果为True的话
- allow_nan: 确定是否为允许的值
- indent: 会以美观的方式来打印,呈现,实现缩进,indent的数值表示缩进的位数
- separators: 对象分隔符,去掉逗号“,”和冒号“:”后面的空格。separators=(’,’,’:’)
- encoding: 编码方式,默认为utf-8
- sort_keys: 如果是字典对象,选择True的话,表示升序,会按照键的ASCII码来排序,是否按字典排序(a到z)输出,默认编码成json格式字符串后,是紧凑输出,并且也没有顺序的,不利于可读。
json.loads()
将json的字符串解码成python对象
>>> json.loads('{"a":"b"}')#外面用单引号
{'a': 'b'}
>>> json.loads('{"2":1}')
{'2': 1}
>>> a=json.loads('{"1":{"a":"b"}}')
>>> a
{'1': {'a': 'b'}}