python JSON ValueError

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?

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章