【问题】
处理:
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); 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)