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]))
>>> 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变成加引号,,元组变成了列表
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'}}