JSON Basic Usage

JSON Basic Usage

翻译python docs的json部分内容,原文链接:https://docs.python.org/3.6/library/json.html

试了试几个基本方法

1 json.dump

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流写入fp中,按找下面转换表格:

JSONPython
objectdict
arraylist
stringstr
number(int)int
number(real)float
trueTrue
falseFalse
nullNone
  • skipkeys=true(默认:False):字典中不是基本类型(str,int,float,bool,None)的keys将会被跳过,而不是报错:TypeError.

  • json模块总是产生str对象,而不是bytes对象。所以,fp.write()必须支持str输入。

  • ensure_ascii=true(默认:False):输出会跳过non-ASCII的字符。
  • ensure_ascii=false:non-ASCII字符会输出为is。
  • check_circular=false(默认:True):跳过container types的循环引用检查,此时,一个循环引用会导致OverflowError(或者更糟糕)。
  • allow_nan=false(默认:True):严格按照JSON的规格,序列化超过范围的float值(nan,inf,-inf)时,会报错:ValueError。若allow_nan=true,输出将会用到(nan,inf,-inf)的JavaScript等价物(NAN,Infinity,-Infinity).
  • indent:一个非负的int或string,JSON数组元素和对象会被按照indent(缩进) level整齐的打印。
    • indent=0、复数、”“:插入新行;
    • None(默认值):选择最合适的展示方式;
    • 正数(eg:n):每个等级会缩进n个空格
    • 字符串(eg:”\t”):每个级别按照”\t”缩进
python 3.2 更改:除了整数,允许字符串作为indent的值
  • 分隔符必须是(item_separator, key_separator)元组。indent=None时,默认元组=(‘,’,’:’)。为得到最契合的JSON表示,最好指定(‘,’,’:’)来消除空白。
python 3.4更改:即使indent!=None,(‘,’,’:’)也作为默认元组
  • default需要是一个函数,这样不能序列化的对象能够调用它。它应该返回这个对象的一个可编码的JSON版本,或报错:TypeError。若未指定,直接报错:TypeError。
  • sort_keys=true(默认:False):输出的字典按照key值排序。
  • 要是用一个custom JSONEncoder的子类(e.g. 一个继承了default()的方法来序列化另外的类型),用cls kwarg指定他。否则,json.dump会使用JSONEncoder。
python 3.6更改:所有参数都是keyword-only
  • keyword-only:只能由keyword提供的参数

2 json.dumps

json.dumps(obj,*,skipkeys=False,ensure_ascii=True,check_circular=True,allow_nan=True,cks=None,indent=None,separators=None,default=None,sort_keys=False,**kw)

序列化对象作为一种JSON字符串写入fp中,按照下面转换表格:

JSONPython
objectdict
arraylist,tuple
stringstr
numberint,float,int-&float-derived Enums
trueTrue
falseFalse
nullNone
  • 参数意义与dump()中相同。

  • 注意:不像pickle和marshal,JSON不是一个框架协议,尝试用同一个fp重复调用dump()来序列化多样化的对象会生成一个无效的JSON文件。

  • 注意:在JSON的key/value对里的Keys都是str类型。一个字典转换为JSON格式时,字典里所有的keys都被强制转化为strings。所以,字典A–>A的JSON格式文件–>字典A’,A和A’不一定相等。即:

loads(dumps(x)) != x  # 若x中有non-string keys

Encoding basic Python object hierarchies:

import json
a = json.dumps(['foo',{'bar':('baz', None, 1.0, 2)}])
print(a)
'["foo", {"bar": ["baz", null, 1.0, 2]}]'

Compact encoding: 删去所有空格

print(json.dumps([1,  2,   3,{'s':   3,"1":8}]))
print(json.dumps([1,  2,   3,{'s':   3,"1":8}], separators=(',',':')))
[1, 2, 3, {"s": 3, "1": 8}]
[1,2,3,{"s":3,"1":8}]

Pretty printing: 缩进

json.dumps({'age': 1, 'name': 'lala'}, indent='\t')
'{\n\t"age": 1,\n\t"name": "lala"\n}'

3 json.load

json.load(fp,*,cls=None,object_hook=None,parse_float=None,parse_int=None,parse_constant=None,object_pairs_hook=None,**kw)

反序列化fp文件到一个Python对象中,按照下面转换表格:

JSONPython
objectdict
arraylist
stringstr
number (int)int
number (real)float
trueTrue
falseFalse
nullNone
  • object_hook:一个可选方法,任何对象literal解码(生成一个字典类)结果可调用此方法。object_hook的返回值而不是dict类会被load()使用。这个特点可用于实现custom解码器(e.g. JSON-RPC class hinting)
  • object_pairs_hook:一个可选方法,任何对象literal解码结果以及一个有序对列表可调用此方法。object_pairs_hook的返回值而不是dict类会被load()使用。这个特点可用于实现(依赖于key/value对解码的顺序)custom解码器(e.g. collections.OrderedDict() 会记录插入的顺序)。若oject_hook也被定义,优先使用object_pairs_hook。
Python 3.1更改:支持object_pairs_hook
  • parse_float:JSON float的每个string会被解码成float。等价于float(num_str))。此方法可用于使用JSON floats的另一种数据类型或parser(e.g. decimal.Decimal)
  • parse_int:JSON int的每个string会被解码成int。等价于int(num_str))。此方法可用于使用JSON integers的另一种数据类型或parser(e.g. float)
  • parse_constant:以下中的任意一个strings可调用此方法:’-Infinity’,’Infinity’,’NaN’。此方法可用于在碰到无效JSON数字时,抛出一个错误。
Python 3.1 更改:’null’,’true’,’false’不能再调用parse_constant方法
  • 要是用一个custom JSONDecoder子类,需用 cls kwarg指定他,否则,load()使用JSONDecoder类。另外的关键字参数会被传送到类的构造函数中。
  • 若反序化一个无效的JSON文件,会报错:JSONDecodeError
Python 3.6更改:所有可选参数必须是keyword-only的。

4 json.loads(s,*,encoding=None,cls=None,object_hoot=None,parse_float=None,parse_int=None,parse_constant=None,object_pairs_hook=None,**kw)

反序列化s(一个str,bytes,bytearray类型的实例)实例到Python对象中,按照下面表格:

JSONPython
objectdict
arraylist
stringstr
number (int)int
number (real)float
trueTrue
falseFalse
nullNone
  • 除了反对encoding参数,其余参数意义与load()相同。
  • 反序列化一个无效的JSON文件,会报错:JSONDecodeError。
Python 3.6更改:s 可以是bytes或bytearry类型。输入的编码方式应该为:UTF-8,UTF-16,UTF-32。

Decoding JSON:

import json
json.loads(a)  # Encode部分的a拿来继续用
['foo', {'bar': ['baz', None, 1.0, 2]}]

Specializing JSON object decoding:

import json
def as_complex(dct):
    if '__complex__' in dct: # __complex__值为true时,继续
        return complex(dct['real'], dct['imag']) # 返回复数 real的值+img的值*j

# 用as_complex的方法来load string
json.loads('{"__complex__": true, "real": 1, "imag": 2}', object_hook=as_complex)
(1+2j)
b = json.dumps({"__complex__": 2, "real": 1, "imag": 2})
json.loads(b)['real'] # load后返回原dict,取key=real的值
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值