0
点赞
收藏
分享

微信扫一扫

详解Python中对JSON对象的函数操作


文章目录

  • ​​1 JSON 函数​​
  • ​​1.1 json.dumps​​
  • ​​1.1.1 参数obj​​
  • ​​1.1.2 参数skipkeys​​
  • ​​1.1.3 参数ensure_ascii​​
  • ​​1.1.4 参数check_circular​​
  • ​​1.1.5 参数allow_nan​​
  • ​​1.1.6 参数indent​​
  • ​​1.1.7 参数separators​​
  • ​​1.1.8 参数default​​
  • ​​1.1.9 参数sort_keys​​
  • ​​1.1.10 参数cls​​
  • ​​1.1.11 综合实例​​
  • ​​1.2 json.loads​​
  • ​​1.2.1 参数s​​
  • ​​1.2.2 参数cls​​
  • ​​1.2.3 参数object_hook​​
  • ​​1.2.4 参数parse_float​​
  • ​​1.2.5 参数parse_int​​
  • ​​1.2.6 参数parse_constant​​
  • ​​1.2.7 参数object_pairs_hook​​
  • ​​1.3 json.dump​​
  • ​​1.4 json.load​​
  • ​​2 使用第三方库:Demjson​​
  • ​​2.1 demjson.encode​​
  • ​​2.2 demjson.decode​​
  • ​​3 参考文献​​

博客将介绍如何使用Python去编码和解码JSON对象。JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写。

1 JSON 函数

使用JSON函数需要导入json库:

import json

有四种函数,如下:

函数

描述

json.dumps

将 Python 对象编码成 JSON 字符串

json.loads

将已编码的 JSON 字符串解码为 Python 对象

json.dump

将python中的对象转化成json字符串储存到文件中

json.load

将文件中的json字符串的格式转化成python对象提取出来

① json.dumps()是把python对象转换成json对象的一个过程,生成的是字符串。json.dump()通过一个fp的文件流把python对象转换成的json对象存储到文件中。

② json.loads()针对的是内存对象,将json字符串转换为Python对象。json.load()针对的是文件句柄,从文件中读取json字符串并转换为Python对象。

1.1 json.dumps

json.dumps 用于将 Python 对象编码成 JSON 字符串,也就是说,将Python对象进行json.dumps()后得到的均为字符串str类型的对象。

下面的代码是最普通也是最常用的,没有任何参数。将字典编码为 JSON 格式数据:

>>> import json
>>>
>>> data = {'a':1, 'b':2, 'c':3}
>>> data2 = json.dumps(data)
>>> print(data2)
{"a": 1, "b": 2, "c": 3}
>>>
>>> a = {1, 2, 3}
>>> type(a)
<class 'set'>
>>> b = json.dumps(a) # json不能存储Python的set对象
Traceback (most recent call last):
TypeError: Object of type set is not JSON serializable

下面看看json.dumps的参数吧。语法为:

json.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)

共10种参数,下面详细介绍这10个参数。

1.1.1 参数obj

obj就是要转化成json的对象,如1.1节刚开始的那个示例中的data即为obj。

1.1.2 参数skipkeys

skipkeys默认值是False:【skipkeys=False】。如果字典对象中的各个键值对中存在【键key不是python的基本类型(str,int,float,bool,None)】,就会报TypeError的错误。此时若设置skipkeys=True,则会跳过这类key对应的键值对,不会报错。

示例代码如下:

>>> import json
>>>
>>> x = {'apple':1, 'pine':2,'banana':3, (1,):4} # 第三个key为tuple,不是python的基本类型【str, int, float, bool or None】
>>> y = json.dumps(x) # 报错
Traceback (most recent call last):
TypeError: keys must be str, int, float, bool or None, not tuple
>>>
>>> y = json.dumps(x, skipkeys=True)
>>> print(y) # 跳过并且不会存储这类key对应的键值对,而且不会报错
{"apple": 1, "pine": 2, "banana": 3}

1.1.3 参数ensure_ascii

默认状态下ensure_ascii=True,此时若obj对象中包含非ASCII的字符(non-ASCII),则json.dumps()之后返回的对象中会将这些字符转义为ASCII字符。若ensure_ascii=False,则json.dumps()之后返回的对象中会直接输出这些字符。

示例代码如下:

>>> import json
>>>
>>> x = ['火', '影', '忍', '者']
>>> y = json.dumps(x)
>>> print(y) # 默认ensure_ascii=True,会将non-ASCII字符转义为ASCII字符
["\u706b", "\u5f71", "\u5fcd", "\u8005"]
>>>
>>> y = json.dumps(x, ensure_ascii=False)
>>> print(y) # 不转义直接输出
["火", "影", "忍", "者"]

1.1.4 参数check_circular

自己用不上,所以不做解释。

1.1.5 参数allow_nan

自己用不上,所以不做解释。

1.1.6 参数indent

indent使数据以缩进显示,读起来更加方便清晰。如果indent是非负整数,那么JSON数组元素和对象成员将按indent大小进行缩进。缩进0级即【indent=0】时,只会插入新行。

示例代码如下:

>>> import json
>>>
>>> x = ['apple', 'pine','banana', 'orange']
>>> y = json.dumps(x)
>>> print(y) # 默认无缩进:indent=None
["apple", "pine", "banana", "orange"]
>>>
>>> y = json.dumps(x, indent=0)
>>> print(y) # 缩进0级时,只会插入新行。
[
"apple",
"pine",
"banana",
"orange"
]
>>>
>>> y = json.dumps(x, indent=4)
>>> print(y) # 对每个数据缩进4个字符
[
"apple",
"pine",
"banana",
"orange"
]

1.1.7 参数separators

separators是分隔符,如果指定,则separators必须是一个有两个元素的元组(item_separator, key_separator),分别代表【不同dict项之间的分隔符】和【dict项内key和value之间的分隔符】。默认状态下separators=None,此时separators默认为(’, ', ': ');若要获得最紧凑的JSON表示,可以指定(’,’,’:’)以消除空格。

示例代码如下:

>>> import json
>>>
>>> x = {'apple':1, 'pine':2,'banana':3, 'orange':4}
>>> y = json.dumps(x)
>>> print(y) # 默认状态
{"apple": 1, "pine": 2, "banana": 3, "orange": 4}
>>>
>>> y = json.dumps(x, separators=('|', '='))
>>> print(y) # 指定了separators
{"apple"=1|"pine"=2|"banana"=3|"orange"=4}
>>>
>>> y = json.dumps(x, separators=(',', ':'))
>>> print(y) # 指定(’,’,’:’)以消除空格,以获得最紧凑的JSON表示
{"apple":1,"pine":2,"banana":3,"orange":4}
>>>
>>> x = ['apple', 'pine','banana', 'orange'] # list对象
>>> y = json.dumps(x)
>>> print(y) # 默认状态
["apple", "pine", "banana", "orange"]
>>>
>>> y = json.dumps(x, separators=('|', '='))
>>> print(y) # 指定了separators,但是因为obj不是dict对象,所有只有'|'起作用
["apple"|"pine"|"banana"|"orange"]
>>>
>>> y = json.dumps(x, separators=(',', ':'))
>>> print(y) # 指定(’,’,’:’)以消除空格,以获得最紧凑的JSON表示,同样地,因为obj不是dict对象,所有只有','起作用
["apple","pine","banana","orange"]

1.1.8 参数default

下面是Python官方的原文解释:

``default(obj)`` is a function that should return a serializable version of obj or raise TypeError. The default simply raises TypeError.

译文为:

default(obj)是一个函数,它应该返回一个可序列化的obj版本或引发TypeError。默认只会引发TypeError。

但是,我没有找到具体default是怎么使用的资料。

1.1.9 参数sort_keys

sort_keys参数对非字典对象不起作用。sort_keys默认为False:【sort_keys=False】。若sort_keys=True,则按照key的字母顺序(a到z),将字典对象输出,False为不排序即原样输出。

示例代码如下:

>>> import json
>>>
>>> x = ['apple', 'pine','banana', 'orange']
>>> y = json.dumps(x)
>>> print(y)
["apple", "pine", "banana", "orange"]
>>>
>>> y = json.dumps(x, sort_keys=True)
>>> print(y) # sort_keys参数对非字典对象不起作用
["apple", "pine", "banana", "orange"]
>>>
>>> y = json.dumps(x, sort_keys=False)
>>> print(y) # sort_keys参数对非字典对象不起作用
["apple", "pine", "banana", "orange"]
>>>
>>> x = {'apple':1, 'pine':2,'banana':3, 'orange':4}
>>> y = json.dumps(x)
>>> print(y) # 不指定时,默认sort_keys=False
{"apple": 1, "pine": 2, "banana": 3, "orange": 4}
>>>
>>> y = json.dumps(x, sort_keys=True)
>>> print(y) # 按照key的字母排序将x进行排序
{"apple": 1, "banana": 3, "orange": 4, "pine": 2}
>>>
>>> y = json.dumps(x, sort_keys=False)
>>> print(y) # 不排序即原样输出
{"apple": 1, "pine": 2, "banana": 3, "orange": 4}

1.1.10 参数cls

cls是类的意思,默认为None:【cls=None】,但是我未找到相关资料说明这个cls是什么的类别,所以无法解释。

1.1.11 综合实例

下面的代码尽可能地使用了自己了解的参数:

>>> import json
>>>
>>> x = {'apple':1, 'pine':'火','banana':3, (1,):4}
>>> json_data = json.dumps(x, skipkeys=True, ensure_ascii=False, separators=('|','='))
>>> print(json_data)
{"apple"=1|"pine"="火"|"banana"=3}

1.2 json.loads

json.loads用于解码JSON 数据。该函数返回 Python 字段的数据类型。

下面的代码是最普通也是最常用的,没有任何参数。将JSON 格式数据解码为Python数据对象:

>>> import json
>>>
>>> jsondata = '["apple", "pine", "banana", "orange"]'
>>> x = json.loads(jsondata)
>>> print(x)
['apple', 'pine', 'banana', 'orange']
>>> type(x)
<class 'list'>

下面看看json.loads的参数吧。语法为:

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

共7种参数,下面详细介绍这7个参数。

1.2.1 参数s

将s(这包含JSON文档的str,bytes或bytearray实例)反序列化为Python对象。

示例代码如下:

>>> import json
>>>
>>> s = '["apple", "pine", "banana", "orange"]'
>>> x = json.loads(s)
>>> print(x) # 将s反序列化为Python的list对象。
['apple', 'pine', 'banana', 'orange']

1.2.2 参数cls

cls是类的意思,默认为None:【cls=None】,但是我未找到相关资料说明这个cls是什么的类别,所以无法解释。

1.2.3 参数object_hook

默认值为None,object_hook是一个可选函数,可用于实现自定义解码器。

指定一个函数,该函数负责把反序列化后的基本类型对象转换成自定义类型的对象。

自己用不上,所以不做解释。

1.2.4 参数parse_float

默认值为None。parse_float用来对JSON float字符串进行解码,默认情况下相当于float(num_str),这可用于为JSON浮点数使用另一种数据类型或解析器。

自己用不上,所以不做解释。

1.2.5 参数parse_int

默认值为None。如果指定了parse_int,用来对JSON int字符串进行解码,这可以用于为JSON整数使用另一种数据类型或解析器。

自己用不上,所以不做解释。

1.2.6 参数parse_constant

默认值为None,如果指定了parse_constant,对-Infinity,Infinity,NaN字符串进行调用。如果遇到了无效的JSON符号,会引发异常。

自己用不上,所以不做解释。

1.2.7 参数object_pairs_hook

自己用不上,所以不做解释。

到头来,7个参数中只解释了最简单的第一个参数s…不过也没关系,后面碰到再去详细查资料吧,只能这样了。

1.3 json.dump

json.dump()需要结合Python的文件操作,将转换后的json字符串储存在指定的文件里。

语法如下:

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)

与【1.1 json.dumps】一节中的参数相比,仅仅多了一个参数fp,fp为文件流,类似于C语言的文件指针。

示例代码如下:

import json

data = ['apple', 'pine', 'banana', 'orange']
file_name = 'new.txt' # 将转换后的json字符串储存在指定的文件里,即文件new.txt中
with open(file_name, 'w') as f:
json.dump(data, f)

在运行程序的目录中可以找到new.txt文件,内容如下:

详解Python中对JSON对象的函数操作_dumps

1.4 json.load

语法如下:

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

与【1.2 json.loads】一节中的参数相比,仅仅是s被替换为fp,fp为文件流,类似于C语言的文件指针。

示例代码如下:

>>> import json
>>>
>>> file_name = 'new.txt'
>>> with open(file_name, 'r') as f: # 就是【1.3 json.dump】生成的文件
... data = json.load(f)
...
>>> print(data)
['apple', 'pine', 'banana', 'orange']

2 使用第三方库:Demjson

Demjson 是 python 的第三方模块库,可用于编码和解码 JSON 数据,包含了 JSONLint 的格式化校验功能。

在使用Demjson模块前,我们需要先安装Demjson模块,请自行查资料安装。

函数

描述

encode

将 Python 对象编码成 JSON 字符串

decode

将已编码的 JSON 字符串解码为 Python 对象

2.1 demjson.encode

demjson.encode()用于将Python对象编码成JSON字符串。

语法:

demjson.encode(obj, encoding=None, **kwargs)

示例代码如下:

>>> import demjson
>>>
>>> data = ['apple', 'pine', 'banana', 'orange']
>>> jsondata = demjson.encode(data)
>>> print(jsondata) # 请注意输出无空格,是最紧凑的JSON表示
["apple","pine","banana","orange"]
>>>
>>> import json
>>>
>>> jsondata1 = json.dumps(data)
>>> print(jsondata1)# 请注意输出有空格
["apple", "pine", "banana", "orange"]
>>> jsondata == jsondata1 # 此时demjson.encode与json.dumps的结果不一样
False
>>>
>>> jsondata2 = json.dumps(data, separators=(',',':'))
>>> print(jsondata2) # 请注意输出无空格,是最紧凑的JSON表示
["apple","pine","banana","orange"]
>>> jsondata == jsondata2 # 此时demjson.encode与json.dumps的结果是一样的
True

2.2 demjson.decode

demjson.decode()解码JSON数据为对应的Python字段的数据。

语法:

demjson.decode(txt, encoding=None, **kwargs)

示例代码如下:

>>> import demjson
>>>
>>> jsondata = '["apple", "pine", "banana", "orange"]'
>>> data = demjson.decode(jsondata)
>>> data1 = json.loads(jsondata)
>>> print(data)
['apple', 'pine', 'banana', 'orange']
>>> print(data1)
['apple', 'pine', 'banana', 'orange']
>>> data == data1 # demjson.decode与json.loads的结果是一样的
True

3 参考文献

​​参考文献1​​

​​参考文献2​​

END


举报

相关推荐

0 条评论