1. 程式人生 > >Python中json.loads()無法解析單引號字串問題的兩種解決方法

Python中json.loads()無法解析單引號字串問題的兩種解決方法

目錄

1、json檔案的儲存與載入

2、json.loads()無法解析單引號字串問題

3、解決方案

方案一:替換單引號

方案二:在使用json.loads()前使用eval()和json.dumps()進行處理


1、json檔案的儲存與載入

一般來說,我建立字典、儲存為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檔案如下所示。

dict.json
生成的json檔案 dict.json

 

2、json.loads()無法解析單引號字串問題

可是如果你是以檔案的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 <module>
    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檔案

3、解決方案

方案一:替換字串中的單引號為雙引號

使用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)即可。