python中的json使用误区

1)  json使用的要点,目前json是网络之间通信的一种数据格式,与xml类似,但它的格式比xml要稍微小一些,由于本项目中数据量会比较大,所以尽量采用较小存储的json格式。

但用json格式的时候,会遇到将map对象转换json,以及将服务器上得到的json对象转换为map这两个问题。这个是很显然的,因为是两种异构的格式,所以必须得相互转换。

在python中,使用的比较多的json类库是json(2.4.3以上的版本可以使用),使用方式在文件的开头,importjson即可。

json中有两个关键的方法分别解决以上两个问题,其中json.dumps(map),会将python中的map对象解析成json格式的string;json.loads(string),将json类型的string解析成json对象。由于json在python就是一个map,所以解析成一个json对象,就是解析成map对象,使用起来非常的方便。

在json.loads()使用的时候,会碰到以下几个SB的问题,请注意:

a)             json对象和map对象是一样的,不能直接用map[key]的方式,一定要在前面加map.has_key(key)的判断,否则key一旦不存在就抛出。

b)             loads函数中的object_hook是可以赋值的,它的意思就是对象的钩子,相当于整个loads函数跑完后,会再去执行object_hook对应的函数,那么我们可以在object_hook中做任意想做的事情,比如将所有的key替换成A。

c)              loads完的数据打印出来有可能会变成这样:{u'isSuccess': u'Y'},不管是key还是value都带有一个u的字母,查阅了很多资料,也不得其解,据说底层统一采用unicode的编码的原因。用如下方式访问就是ok的。b['isSuccess'],则显示u'Y',str(b[‘isSuccess’]),则显示为’y’,没有了u,所以自己需要对load完后的对象中所有item,都要用str()的方式重新赋值一遍。建议用方法2中的object_hook来实现。

同样的在使用json.dumps()的时候,也有几个SB的问题,请注意:

a)      python中的map和json虽然都是dict的类,但还是有些不同,比如python中的None对应json中Null,int对应Number,dict对应Object等等,因此强烈推荐用dumps函数进行处理,千万不要自己尝试去解析,非标准的json类,外部系统通常是无法解析的,逼人就是一开始的时候直接将map转换成string提供给外部系统,结果走了一个弯路。

b)      dumps的时候,会碰到一个中文字符的比如,比如c[1]="中国",那么print c则显示:{1: '\xe4\xb8\xad\xe5\x9b\xbd'},这就悲剧了,外部系统完全就不知道\xe4是什么东西啊,所以我们必须将这些ascii编码的东西转换为标准的unicode.使用dumps(a,ensure_ascii=False),通过print函数,我们很明细的能够看到,没有加ensure_ascii参数的结果:{"1": "\u4e2d\u56fd"},加了之后:printstr(json.dumps(c,ensure_ascii=False))   显示:{"1":"中国"}。在这块地方我也绕了不少弯路。

 

Json的dumps和loads效率和urllib2的open相比,基本可以忽视。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值