python JSON ValueError: Expecting property name: line 1 colu
使用json.loads,解析以下数据为json格式时,报错 a?=?[{'start_city':?'1',?'end_city':?'aaa',?'number':?1},?????{'start_city':?'2',?'end_city':?'bbb',?????{'start_city':?'3',?'end_city':?'ccc',?'number':?1}] 报错提示:ValueError: Expecting property name: line 1 column 2 (char 1) 代码如下 a?=?"[{'start_city':?'1', ?????{'start_city':?'2', ?????{'start_city':?'3',?'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', ????...:??????{'start_city':?'2', ????...:??????{'start_city':?'3',?'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',?'start_city':?'2'},?{'end_city':?'ccc',?'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. 最方便方法,但是会有安全隐患方法 ????????请参考文章:python 为什么说eval要慎用?使用eval 带来的潜在风险?什么情况下使用eval? In?[38]:?a?=?"[{'start_city':?'1',?'number':?1}]" In?[39]:?eval(a) Out[39]: [{'end_city':?'aaa',?'start_city':?'3'}] (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |