目录
1、json文件的保存与加载
2、json.loads()无法解析单引号字符串问题
3、解决方案
方案一:替换单引号
方案二:在使用json.loads()前使用eval()和json.dumps()进行处理
一般来说,我创建字典、保存为json文件、加载json文件的常用做法如下面代码所示。
import json
# 创建字典
dict = {}
dict['id'] = 'cc695906217'
dict['name'] = '种冲'
# 打印字典
print(dict)
# 保存为json文件
with open('dict.json','w',encoding='utf-8') as f:
json.dump(dict,f,ensure_ascii=False)
# 加载json文件
with open('dict.json','r',encoding='utf-8') as f:
js = json.load(f)
print(js['name'])
程序运行的结果如下所示。
C:\Workplace\PyPlace\WorkProjs\chong_csdn_blog\venv\Scripts\python.exe C:/Workplace/PyPlace/WorkProjs/chong_csdn_blog/json_loads_problem/json_loads_problem.py
{'id': 'cc695906217', 'name': '种冲'}
种冲
Process finished with exit code 0
生成的json文件如下所示。
生成的json文件 dict.json
可是如果你是以文件的write()方法将字典按照字符串保存时,可能会出现下面的问题。
import json
# 创建字典
dict = {}
dict['id'] = 'cc695906217'
dict['name'] = '种冲'
# 打印字典
print(dict)
# 保存为json文件
with open('dict.json','w',encoding='utf-8') as f:
f.write((str)(dict))
# 加载json文件
with open('dict.json','r',encoding='utf-8') as f:
js = json.load(f)
print(js['name'])
程序运行结果是:
C:\Workplace\PyPlace\WorkProjs\chong_csdn_blog\venv\Scripts\python.exe C:/Workplace/PyPlace/WorkProjs/chong_csdn_blog/json_loads_problem/json_loads_problem.py
Traceback (most recent call last):
{'id': 'cc695906217', 'name': '种冲'}
File "C:/Workplace/PyPlace/WorkProjs/chong_csdn_blog/json_loads_problem/json_loads_problem.py", line 14, in
js = json.load(f)
File "C:\Users\chongchong\AppData\Local\Programs\Python\Python37\lib\json\__init__.py", line 296, in load
parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw)
File "C:\Users\chongchong\AppData\Local\Programs\Python\Python37\lib\json\__init__.py", line 348, in loads
return _default_decoder.decode(s)
File "C:\Users\chongchong\AppData\Local\Programs\Python\Python37\lib\json\decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "C:\Users\chongchong\AppData\Local\Programs\Python\Python37\lib\json\decoder.py", line 353, in raw_decode
obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
Process finished with exit code 1
原因在于保存的json文件中的字符串由原来的双引号变成了单引号,而json.loads()无法解析单引号类型的字符串。
生成了单引号的dict.json文件使用s.replace()将字符串中的单引号替换为双引号。
import json
# 创建字典
dict = {}
dict['id'] = 'cc695906217'
dict['name'] = '种冲'
# 打印字典
print(dict)
# 保存为json文件
with open('dict.json','w',encoding='utf-8') as f:
f.write((str)(dict))
# 加载json文件
with open('dict.json','r',encoding='utf-8') as f:
s = f.read()
print(s)
s = s.replace('\'','\"')
js = json.loads(json.dumps(eval(s)))
print(js['name'])
运行结果:
{'id': 'cc695906217', 'name': '种冲'}
{'id': 'cc695906217', 'name': '种冲'}
种冲
import json
# 创建字典
dict = {}
dict['id'] = 'cc695906217'
dict['name'] = '种冲'
# 打印字典
print(dict)
# 保存为json文件
with open('dict.json','w',encoding='utf-8') as f:
f.write((str)(dict))
# 加载json文件
with open('dict.json','r',encoding='utf-8') as f:
s = f.read()
print(s)
js = json.loads(json.dumps(eval(s)))
print(js['name'])
运行结果:
{'id': 'cc695906217', 'name': '种冲'}
{'id': 'cc695906217', 'name': '种冲'}
种冲
解析:虽然json.loads()无法解析单引号字符串,但是eval()这个内置函数可以将字符串表达式转化为值(很智能),它可以解析单引号字符串。在这里,eval()将字符串{'id': 'cc695906217', 'name': '种冲'}转化为字典对象,json.dumps()可将字典对象转化为JSON格式的字符串,然后json.loads()可将JSON格式的字符串解析为字典对象。
def 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):
"""Serialize ``obj`` to a JSON formatted ``str``.
是不是有冗余操作了?可直接令js=eval(s)即可。