python JSON ValueError: Expecting property name: line 1 column 2 (char 1)
使用json.loads,解析以下數據爲json格式時,報錯
a = [{'start_city': '1', 'end_city': 'aaa', 'number': 1},
{'start_city': '2', 'end_city': 'bbb', 'number': 1},
{'start_city': '3', 'end_city': 'ccc', 'number': 1}]
報錯提示:ValueError: Expecting property name: line 1 column 2 (char 1)
代碼如下
a = "[{'start_city': '1', 'end_city': 'aaa', 'number': 1},\
{'start_city': '2', 'end_city': 'bbb', 'number': 1},\
{'start_city': '3', 'end_city': 'ccc', 'number': 1}]"
import json
json.loads(a)
原因是爲什麼?
這要先從json格式什麼來講。
JSON是一種取代XML的數據結構,和xml相比,它更小巧但描述能力卻不差,由於它的小巧所以網絡傳輸數據將減少更多流量從而加快速度。
JSON就是一串字符串 只不過元素會使用特定的符號標註。
{} 雙括號表示對象
[] 中括號表示數組
"" 雙引號內是屬性或值
: 冒號表示後者是前者的值(這個值可以是字符串、數字、也可以是另一個數組或對象)
所以 {"name": "Michael"} 可以理解爲是一個包含name爲Michael的對象
而[{"name": "Michael"},{"name": "Jerry"}]就表示包含兩個對象的數組
當然了,你也可以使用{"name":["Michael","Jerry"]}來簡化上面一部,這是一個擁有一個name數組的對象
【特別提醒:現在還有很多人存在一些誤區,爲什麼{name:’json’}在檢驗時通過不了,那是因爲JSON官網最新規範規定:如果是字符串,那不管是鍵或值最好都用雙引號引起來,所以上面的代碼就是{“name”:”json”}】
所以在python中json.loads無法解析單號,就會提示錯誤ValueError: Expecting property name: line 1 column 3 (char 2)
解決辦法如下:
1.使用ast方法,最安全方法
In [15]: a = "[{'start_city': '1', 'end_city': 'aaa', 'number': 1},\
...: {'start_city': '2', 'end_city': 'bbb', 'number': 1},\
...: {'start_city': '3', 'end_city': 'ccc', 'number': 1}]"
In [16]: import ast
In [17]: ast.literal_eval(a)
Out[17]:
[{'end_city': 'aaa', 'number': 1, 'start_city': '1'},
{'end_city': 'bbb', 'number': 1, 'start_city': '2'},
{'end_city': 'ccc', 'number': 1, 'start_city': '3'}]
2.最笨方法使用replace,把單引號轉換爲雙引號
In [35]: strs = "{'key':'val'}"
In [36]: strs = strs.replace("'",'"')
In [37]: json.loads(strs)
Out[37]: {u'key': u'val'}
3. 最方便方法,但是會有安全隱患方法
In [38]: a = "[{'start_city': '1', 'end_city': 'aaa', 'number': 1},\
...: {'start_city': '2', 'end_city': 'bbb', 'number': 1},\
...: {'start_city': '3', 'end_city': 'ccc', 'number': 1}]"
In [39]: eval(a)
Out[39]:
[{'end_city': 'aaa', 'number': 1, 'start_city': '1'},
{'end_city': 'bbb', 'number': 1, 'start_city': '2'},
{'end_city': 'ccc', 'number': 1, 'start_city': '3'}]
請參考文章:python 爲什麼說eval要慎用?使用eval 帶來的潛在風險?什麼情況下使用eval?