python3-----json函数

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可以表示四种主类型数据

  1. 字符串 string
  2. 数字 number
  3. 布尔类 boolean
  4. 空值 null

以及两结数据结构

  1. 对象 object
  2. 数组 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"编码前
", a)
print(u"编码后
", b)
print(u"解码后
", 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'}}
原文地址:https://www.cnblogs.com/llb123/p/13398728.html