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