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

【问题】

处理:

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("'", "\"");

的代码,去:

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

就可以了。



发表评论

电子邮件地址不会被公开。 必填项已用*标注

无觅相关文章插件,快速提升流量