最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

【已解决】Python中使用json.loads解码字符串时出错:ValueError: Expecting property name: line 1 column 1 (char 1)

JSON crifan 11239浏览 0评论

【问题】

处理:

http://www.yupoo.com/photos/shanshu/87329678/

中的html代码过程中,用代码:

photoInfoDict = json.loads(photoInfoJson);

 

去解码json字符串:

{id:'379879-87329678',owner:'379879',ownername:'shanshu',title:'IMG_3464',description:'',bucket:'shanshu',key:'CsFzMuHz',license:0,stats_notes: 0,albums: ['379879-181880',],tags:[{name:'20121202', author: '379879'},{name:'天平山赏红枫', author: '379879'}],owner:{id: 379879,username: 'shanshu',nickname: 'shanshu'}}

注:

格式化后,为:

{
	id : '379879-87329678',
	owner : '379879',
	ownername : 'shanshu',
	title : 'IMG_3464',
	description : '',
	bucket : 'shanshu',
	key : 'CsFzMuHz',
	license : 0,
	stats_notes : 0,
	albums : ['379879-181880', ],
	tags : [{
			name : '20121202',
			author : '379879'
		}, {
			name : '天平山赏红枫',
			author : '379879'
		}
	],
	owner : {
		id : 379879,
		username : 'shanshu',
		nickname : 'shanshu'
	}
}

 

结果出错:

    photoInfoDict = json.loads(photoInfoJson);

  File "D:\tmp\dev_install_root\Python27_x64\lib\json\__init__.py", line 326, in loads

    return _default_decoder.decode(s)

  File "D:\tmp\dev_install_root\Python27_x64\lib\json\decoder.py", line 366, in decode

    obj, end = self.raw_decode(s, idx=_w(s, 0).end())

  File "D:\tmp\dev_install_root\Python27_x64\lib\json\decoder.py", line 382, in raw_decode

    obj, end = self.scan_once(s, idx)

ValueError: Expecting property name: line 1 column 1 (char 1)

 

【解决过程】

1.参考:

Error msg from using wrong quotes in JSON is unhelpful

中,解释说是,JSON字符串中,不能包含单引号,而必须是双引号。

2.所以去改为双引号:

        photoInfoJsonDoubleQuote = photoInfoJson.replace("'", '"');
        logging.info("photoInfoJsonDoubleQuote=%s", photoInfoJsonDoubleQuote);
        photoInfoDict = json.loads(photoInfoJsonDoubleQuote);
        logging.info("photoInfoDict=%s", photoInfoDict);

结果错误依旧。

3.看起来,应该是,属性,没有添加双引号所导致的,应该是类似于:

"id":"379879-87329678"

估计才可以的。

4.给定utf8参数:

        photoInfoJsonDoubleQuote = photoInfoJson.replace("'", '"');
        logging.info("photoInfoJsonDoubleQuote=%s", photoInfoJsonDoubleQuote);
        #photoInfoDict = json.loads(photoInfoJsonDoubleQuote);
        photoInfoDict = json.loads(photoInfoJsonDoubleQuote, "UTF-8");
        logging.info("photoInfoDict=%s", photoInfoDict);

也还是不行:

5.网上找了半天,结果找到自己的帖子:

【已解决】Python中用json.loads去解析字符串出错:ValueError: Expecting property name: line 1 column 51 (char 51)

然后手动处理后,结果用如下代码:

        photoInfoJsonAddQuote = re.sub(r"(,?)(\w+?)\s*?:", r"\1'\2':", photoInfoJson);
        logging.info("photoInfoJsonAddQuote=%s", photoInfoJsonAddQuote);
        photoInfoJsonDoubleQuote = photoInfoJsonAddQuote.replace("'", "\"");
        logging.info("photoInfoJsonDoubleQuote=%s", photoInfoJsonDoubleQuote);
        
        #photoInfoJsonDoubleQuote = photoInfoJson.replace("'", '"');
        #logging.info("photoInfoJsonDoubleQuote=%s", photoInfoJsonDoubleQuote);
        #photoInfoDict = json.loads(photoInfoJsonDoubleQuote);
        #photoInfoDict = json.loads(photoInfoJsonDoubleQuote, "UTF-8");
        photoInfoDict = json.loads(photoInfoJsonDoubleQuote);
        logging.info("photoInfoDict=%s", photoInfoDict);

上述问题是解决了,但却又出现其他错误:

ValueError: No JSON object could be decoded

6.详细过程参见:

【已解决】Python中用json.loads解码字符串出错:ValueError: No JSON object could be decoded

 

【总结】

此处的

ValueError: Expecting property name: line 1 column 1 (char 1)

类型的错误,就是由于JSON中,标准语法中,不支持单引号,

属性或者属性值,都必须是双引号括起来的。

所以,可以用类似于:

addedSingleQuoteJsonStr = re.sub(r"(,?)(\w+?)\s*?:", r"\1'\2':", orginalJsonStr);
doubleQuotedJsonStr = addedSingleQuoteJsonStr.replace("'", "\"");

的代码,去:

  • 给属性添加单引号;
  • 把所有的单引号替换成双引号;

就可以了。

转载请注明:在路上 » 【已解决】Python中使用json.loads解码字符串时出错:ValueError: Expecting property name: line 1 column 1 (char 1)

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (3)

  1. 这篇文章讲解json.loads为什么报错原因,和多种解决方法 http://www.chenxm.cc/post/328.html?crifan
    陈新明7年前 (2017-10-16)回复
  2. 完美地解决了我的问题,谢谢分享.
    williezh7年前 (2017-07-14)回复
  3. import json filename='username.json' try: with open(filename) as f_obj: username=json.load(f_obj) except FileNotFoundError: username=input("what is your name?") with open(filename,'w') as f_obj: json.dump(username,f_obj) print("we'll remember you when you come back, "+username+"!") else: print("welcome back, "+username+"!") 你好,我在学Python的时候也出现过这个错误,没能解决,网上找了很久也没有能够解决的办法,若能指点一二,非常感谢
    Lee8年前 (2017-03-07)回复
92 queries in 0.187 seconds, using 22.16MB memory