Python解析json之ValueError: Expecting property name enclosed in double quotes: line 1 column 2(char 1)


Posted in Python onJuly 06, 2017

前言

在Python中提供了json包来方便快捷的解析json字串的转换过程,但是碰到了一个比较奇怪的问题,就是不太正确的json串如何来解析?

1. 问题的提出

今天在处理一个http请求的响应json之时,基于python进行解析,碰到了如下错误:

Traceback (most recent call last): 
 
 File "<ipython-input-16-bff463ed9408>", line 1, in <module> 
 json.loads(r.text) 
 
 File "/Users/tonychen/anaconda2/lib/python2.7/json/__init__.py", line 339, in loads 
 return _default_decoder.decode(s) 
 
 File "/Users/tonychen/anaconda2/lib/python2.7/json/decoder.py", line 364, in decode 
 obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
 
 File "/Users/tonychen/anaconda2/lib/python2.7/json/decoder.py", line 380, in raw_decode 
 obj, end = self.scan_once(s, idx) 
 
ValueError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

看来是解析json的时候出错了....

代码如下:       

import json 
import requests 
 
user_agent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)" 
def get_header(): 
 return { 
  'User-Agent': user_agent, 
  'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 
  'Accept-Language': 'en-US,en;q=0.5', 
  'Connection': 'keep-alive', 
  'Accept-Encoding': 'gzip, deflate', 
 } 
TEST_URL = 'http://ip.chinaz.com/getip.aspx' 
 
r = requests.get(url=TEST_URL, headers=get_header(), timeout=5) 
jsonstr = json.loads(r.text) 
 
print(jsonstr)

报错的代码行: json.loads(r.text)

那问题出在哪里呢?

2.  问题的分析

让我们先来看看,r.text中的信息是什么吧:

 >> r.text

u"{ip:'103.47.146.9',address:'\u4e9a\u592a\u5730\u533a '}"

仔细观察之后,发现其实应该是ip,address的字段没有相应的引号来包装,所以json无法正确的进行字符串的处理

那正确的json串格式应该是什么样子呢?我们来做个样例看一下

   >> json1 = {'key1': 'val1', 'key2':'val2'}

   >> json.dumps(json1)

'{"key2": "val2", "key1": "val1"}'

正如我们在上文中提到的问题,应该是key没有正确的被括起来。

3.  问题的解决

知道问题出在哪里之后,我们就可以针对性地进行解决了。问题的解决思路有两条:

    a. 针对字符串来进行处理,保证字符串符合json的格式要求

    b.  借助第三方包的帮助顺利解决这个问题

相比而言,方案b可以简便和易用,我们这里使用了demjson的包来处理这个问题。

安装: pip install demjson

使用:  json_obj = demjson(json_string)

简单的一个调用就将这个问题一扫而光,是不是非常的简单易用呀?

4.  demjson的介绍

快速说明: http://deron.meranda.us/python/demjson/

demjson有两个主要的方法:

  encode  编码,将对象转换为json

  decode   解码,将json转化为对象

总结

这个问题的产生主要还是服务端在进行json转换的过程中没有很好处理好这个问题造成的,正常来说,一般不应该出现的的。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
python用10行代码实现对黄色图片的检测功能
Aug 10 Python
Android应用开发中Action bar编写的入门教程
Feb 26 Python
Python实现新浪博客备份的方法
Apr 27 Python
解析Mac OS下部署Pyhton的Django框架项目的过程
May 03 Python
理解python中生成器用法
Dec 20 Python
python jieba分词并统计词频后输出结果到Excel和txt文档方法
Feb 11 Python
Python 实现还原已撤回的微信消息
Jun 18 Python
python爬虫之爬取百度音乐的实现方法
Aug 24 Python
Python实现数值积分方式
Nov 20 Python
使用python绘制二维图形示例
Nov 22 Python
Python 改变数组类型为uint8的实现
Apr 09 Python
ffmpeg+Python实现B站MP4格式音频与视频的合并示例代码
Oct 21 Python
CentOS 7下Python 2.7升级至Python3.6.1的实战教程
Jul 06 #Python
Python中定时任务框架APScheduler的快速入门指南
Jul 06 #Python
Python如何快速实现分布式任务
Jul 06 #Python
Python3下错误AttributeError: ‘dict’ object has no attribute’iteritems‘的分析与解决
Jul 06 #Python
Python标准库sched模块使用指南
Jul 06 #Python
用virtualenv建立多个Python独立虚拟开发环境
Jul 06 #Python
基于Python的关键字监控及告警
Jul 06 #Python
You might like
Yii配置与使用memcached缓存的方法
2016/07/13 PHP
php实现的XML操作(读取)封装类完整实例
2017/02/23 PHP
PHP获取文件扩展名的常用方法小结【五种方式】
2018/04/27 PHP
jQuery中获取Radio元素值的方法
2013/07/02 Javascript
Javascript玩转继承(三)
2014/05/08 Javascript
一个奇葩的最短的 IE 版本判断JS脚本
2014/05/28 Javascript
fckeditor粘贴Word时弹出窗口取消的方法
2014/10/30 Javascript
JavaScript中的object转换函数toString()与valueOf()介绍
2014/12/31 Javascript
Jquery on方法绑定事件后执行多次的解决方法
2016/06/02 Javascript
AngularJS 实现弹性盒子布局的方法
2016/08/30 Javascript
获取IE浏览器Cookie信息的方法
2017/01/23 Javascript
JavaScript截屏功能的实现代码
2017/07/28 Javascript
JavaScript对象的浅拷贝与深拷贝实例分析
2018/07/25 Javascript
vue form 表单提交后刷新页面的方法
2018/09/04 Javascript
解决layer.msg 不居中 ifram中的问题
2019/09/05 Javascript
Vue中使用better-scroll实现轮播图组件
2020/03/07 Javascript
HTML元素拖拽功能实现的完整实例
2020/12/04 Javascript
Python中声明只包含一个元素的元组数据方法
2014/08/25 Python
在Django的模板中使用认证数据的方法
2015/07/23 Python
Django项目中用JS实现加载子页面并传值的方法
2018/05/28 Python
Python pip替换为阿里源的方法步骤
2019/07/02 Python
django-filter和普通查询的例子
2019/08/12 Python
Python MongoDB 插入数据时已存在则不执行,不存在则插入的解决方法
2019/09/24 Python
pytorch使用tensorboardX进行loss可视化实例
2020/02/24 Python
python中id函数运行方式
2020/07/03 Python
详解python tcp编程
2020/08/24 Python
python爬取豆瓣电影排行榜(requests)的示例代码
2021/02/18 Python
Whittard官方海外旗舰店:英国百年茶叶品牌
2018/02/22 全球购物
2015年小学语文工作总结
2015/05/25 职场文书
logback 实现给变量指定默认值
2021/08/30 Java/Android
angular4实现带搜索的下拉框
2022/03/25 Javascript
游戏《我的世界》澄清Xbox版暂无计划加入光追
2022/04/03 其他游戏
Python中itertools库的四个函数介绍
2022/04/06 Python
MySQL数据库Innodb 引擎实现mvcc锁
2022/05/06 MySQL
React如何使用axios请求数据并把数据渲染到组件
2022/08/05 Javascript
spring boot实现文件上传
2022/08/14 Java/Android