今天在處理 JSON 數據的時候遇到了一個意想不到的問題,不過也算是個小問題吧,記錄一下解決方案,同時提醒自己下次不要犯同樣的錯誤了。
目錄
一、json
使用 Python 處理 JSON 數據還是非常簡單的,常用的命令有兩個:
- json.loads:用於解碼 JSON 數據。該函數返回 Python 字段的數據類型
- json.dumps:用於將 Python 對象編碼成 JSON 字符串
(一)json.loads
用於解碼 JSON 數據。該函數返回 Python 字段的數據類型,最常使用的代碼如下:
import json
jsonData = '{"a":1,"b":2,"c":3,"d":4,"e":5}'
data = json.loads(jsonData)
print(type(data))
print(data)
運行結果:
<class 'dict'>
{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
簡單來說,就是把一段 JSON 字符串解析爲 Python 的 dict 。
(二)json.dumps
用於將 Python 對象編碼成 JSON 字符串,最常使用的代碼如下:
import json
data = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
jsonData = json.dumps(data)
print(type(jsonData))
print(jsonData)
運行結果:
<class 'str'>
{"a": 1, "b": 2, "c": 3, "d": 4, "e": 5}
簡單來說,就是把一段 Python 的 dict 解析爲 JSON 字符串 。
這裏,我們可以使用參數讓 JSON 數據格式化輸出,修改的代碼如下:
jsonData = json.dumps(data, sort_keys=True, indent=4, separators=(',', ': '))
運行結果:
<class 'str'>
{
"a": 1,
"b": 2,
"c": 3,
"d": 4,
"e": 5
}
二、問題
“Expecting property name enclosed in double quotes: line 1 column 2 (char 1)”翻譯爲“要求屬性名用雙引號括起來:第1行第2列(字符1)”。這個問題的出現是因爲在把一段 Python 的 dict 解析爲 JSON 字符串時,沒有使用上述的 json.dumps 方法,而是使用 str 方法強制將其解析爲 JSON 字符串,代碼如下:
data = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
jsonData = str(data)
print(type(jsonData))
print(jsonData)
運行結果:
<class 'str'>
{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
可以看到這種運行方式與使用 json.dumps 方法的運行結果十分相似,但是當我們重新將該輸出結果 jsonData 解析爲 Python 的 dict 時,問題就出現了,代碼如下:
import json
data = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
jsonData = str(data)
text = json.loads(jsonData)
print(type(text))
print(text)
運行結果:
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
三、解決方法
demjson 是 Python 的第三方模塊庫,可用於編碼和解碼JSON 數據,包含了 JSONLint 的格式化及校驗功能,可以有效處理上述問題。
常用的命令有兩個:
- demjson.encode:將 Python 對象編碼成 JSON 字符串
- demjson.decode:將已編碼的 JSON 字符串解碼爲 Python 對象
具體使用方法與 json.loads 和 json.dumps 相似,就不過多闡述了。