方案一:替换字符串中的单引号为双引号
使用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': '种冲'}
种冲
方案二、在使用json.loads()前使用eval()和json.dumps()进行处理
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)即可。