JSON Basic Usage
2017-10-26 16:59
218 查看
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中,按找下面转换表格:
JSON | Python |
---|---|
object | dict |
array | list |
string | str |
number(int) | int |
number(real) | float |
true | True |
false | False |
null | None |
json模块总是产生str对象,而不是bytes对象。所以,fp.write()必须支持str输入。
ensure_ascii=true(默认:False):输出会跳过non-ASCII的字符。
ensure_ascii=false:non-
4000
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中,按照下面转换表格:
JSON | Python |
---|---|
object | dict |
array | list,tuple |
string | str |
number | int,float,int-&float-derived Enums |
true | True |
false | False |
null | None |
注意:不像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对象中,按照下面转换表格:
JSON | Python |
---|---|
object | dict |
array | list |
string | str |
number (int) | int |
number (real) | float |
true | True |
false | False |
null | None |
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对象中,按照下面表格:JSON | Python |
---|---|
object | dict |
array | list |
string | str |
number (int) | int |
number (real) | float |
true | True |
false | False |
null | None |
反序列化一个无效的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的值
相关文章推荐
- 语音识别pocketsphinx#basic_usage/hello_ps.c
- Python语言中对于json数据的编解码——Usage of json a Python standard library
- [翻译]Json.NET API-Linq to Json Basic Operator(基本操作)
- Java Web开发Basic(四) JSON
- [翻译]Json.NET API-Linq to Json Basic Operator(基本操作)
- python网页模板mako,basic-usage文档
- json Basic knowledge
- Git basic usage and work flow
- OGRE中级教程二 RaySceneQueries and Basic Mouse Usage
- [更新]一份包含: 采用RSA JWT(Json Web Token, RSA加密)的OAUTH2.0,HTTP BASIC,本地数据库验证,Windows域验证,单点登录的Spring Security配置文件
- linux sh : sed and awk's basic usage
- github basic usage in windows
- github basic usage in windows
- python Basic usage
- Some basic javascript usage
- What is JSON and Its usage
- Summary on 20080616: Basic usage of Enum in Java1.5
- 26 BasicUsageEnvironment基本使用环境——Live555源码阅读(三)UsageEnvironment
- lua basic usage
- JSON Introduction and JSONObject usage