加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python JSON ValueError: Expecting property name: line 1 colu

发布时间:2020-12-17 17:02:10 所属栏目:Python 来源:网络整理
导读:使用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 pr

使用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'}]


(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读