Python下JSON格式的读写

一、

JSON (JavaScript Object Notation)是一种数据交换格式。

JSON 的规定字符集是UTF-8,字符串必须使用""双引号,Object的键也必须使用双引号,不能使用单引号;

JSON格式的数组或者对象中,不同的元素用逗号隔开,最后一个元素后面,不能加逗号。

二、

1、dump()和load()

dump主要用来json文件写入,和load(读取)配合使用。

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)

skipkeys: 如果' skipkeys '=true(默认为False),那么如果' dict '键不是基本类型

('str','int','float','bool','None'),将被忽略而不是抛出TypeError。

ensure_ascii: 如果ensure_ascii=False(默认为True),返回值可以包含非ASCII字符(如果‘obj’中有非ASCII字符),若为True,则所有返回的字符都是用JSON转义后的。

check_circular: 如果check_circular=False(默认为True),那么对于容器类型的循环引用检查将被跳过,可能导致溢出错误或者更糟。

allow_nan: 如果allow_nan=False(默认为True),那么在严格的JSON规范中,序列化外的float值(‘nan’,‘inf’,‘-inf’)将会有ValueError,而不是使用JavaScript中等同的值代替(‘NaN’,‘Infinity’,‘-Infinity’)。

indent: 如果' indent '是一个非负整数,那么JSON数组元素和对象成员将以indent为缩进级别进行打印。一个缩进0的级别只会插入新的行。“None”表示没有缩进(默认为None)。

separators:如果指定,'分隔符'应该是(item_separator, key_separator) 元组,默认值为''(',',':')'';如果缩进是None和''(',',':')'',要获得最紧凑的JSON展示,您应该指定''(',',':')''以消除空格(默认为None)。

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

sort_keys: 如果sort_keys=True(默认为' ' False '),则输出的字典将按键排序。

>>>import json
>>>data = [{'a': 'apple', 'b': 'banana', 'c': [1, 2, 3]}, 11, 'test', True]
>>>f = open('./test.txt', 'a')
>>>json.dump(data, f)  # 写入文件后,单引号会被转换成双引号
>>>f.close()

>>>f = open('./test.txt', 'r')
>>>temp = json.load(f)
>>>temp
[{'a': 'apple', 'b': 'banana', 'c': [1, 2, 3]}, 11, 'test', True]
>>>type(temp)
<class 'list'>

使用dump写入文件后,单引号会被转换成双引号,如图:

2、dumps()和loads()

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)  # 参数用法和dump基本相同

loads()  # 把字符串反序列化为对象

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

object_hook:“object_hook”是一个可选函数,任何对象文字解码的结果都可以调用它(一个'dict')。返回值“object_hook”将代替“dict”。这个特性可以用于实现自定义解码器(例如,JSON-RPC类提示)。

parse_float:如果指定,它将被调用,每个JSON float的字符串将被解码。默认情况下,这相当于float(num_str)。这可以用于使用另一个数据类型或解析器。对于JSON浮点数(例如:decimal.Decimal . decimal)。

parse_int:如果指定,将使用字符串调用parse_int '要解码的每个JSON整数。默认情况下,这是等价的int(num_str)。这可以用于使用另一个数据类型或解析器。对于JSON整数(例如浮点数)。

parse_constant:如果指定'parse_constant',将使用以下字符串之一调用:-Infinity、Infinity、NaN。如果遇到无效的JSON数字,可以使用它来引发异常。

object_pairs_hook:'object_pairs_hook '是一个可选的函数,它将被调用的结果与一个有序的双成对列表的结果相匹配。将使用' object_pairs_hook ' 的返回值而不是' dict '。此特性可用于实现自定义解码器,该解码器依赖于密钥和值对解码的顺序(例如,集合、OrderedDict将记住插入的顺序)。如果' object_hook '也被定义,那么' object_pairs_hook '将优先。

>>>js = json.dumps(data)
>>>js
'[{"a": "apple", "b": "banana", "c": [1, 2, 3]}, 11, "test", true]'
>>>type(js)
<class 'str'>

>>>data2 = [{'b': 'banana'}, {'a': 'apple'}, {'c': [1, 2, 3]}]
>>>a = json.dumps(data2, indent=2)  # 缩进
>>>f = open('D:\\Users\\Dong\\Desktop\\test2.txt','w')
>>>f.write(a)
>>>f.close()

>>>ja = json.loads(js)
>>>ja
[{"a": "apple", "b": "banana", "c": [1, 2, 3]}, 11, "test", true]
>>>type(ja)
<class 'list'>

test2.txt内容如图:

猜你喜欢

转载自blog.csdn.net/qq_34172340/article/details/81289360