python操作json增加一个变量_Python中的json操作

Python中的json操作

标签(空格分隔): python 编码 json

字符串前缀问题

字符串前缀可以有r,u

r:表示原始(raw)字符串,比如'\n'不会被转义。常用于正则。

u:表示unicode字符串。

python3系列的字符串默认是unicode,无需用u进行转码。我用的是python2.7,所以还是要手动处理编码。

发生问题的一个场景是:从某个url抓取json格式数据,import了python自带的json或simplejson包,调用其loads()方法后,得到的对象(字典)的key的类型是unicode,形如:

obj={

u'name':'chris',

u'age':22

}

而我当前的一个函数,传入参数为一个dict字典,用它生成为sql语句,带着u的insert语句插入数据库会报错。需要去除u。

带u是unicode类型,不带u的是字符串类型。对于一个unicode变量,可以用encode()函数转为str类型。但是现在有一整个字典的key都要转换,我不知道怎么转换。

一个解决方法是重写一个json构建/解析的函数。我并不想重复造轮子,只是python2.7下json和simplejson两个包太难用。尝试了各种参数,还是无法得到key为str类型而不是unicode类型的结果。

我传给你的是ascii编码的对象,为什么不能返还给我一个ascii编码的对象?果断自己写一个好用的。

一个简陋的json构建/解析实现

dumps(序列化)

------------------->

obj str

对象 字符串

loads(反序列化)

这里采用类似dumps和loads的名字,不过加了自己的前缀。

从obj对象(python中是字典类型)到str类型,是序列化(dumps)的过程;把str解析后装载为obj对象,是反序列化(loads)的过程。序列化目的在于网络传输。

#!/usr/bin/python

#coding:utf-8

import types

#从obj到str

def chris_dumps(dict_data):

jar=""

result = chris_dumps_iter(dict_data, jar)

return "{"+result+"}"

def chris_dumps_iter(dict_data, jar):

for k in dict_data:

jar = jar + "\"" + k + "\": "

if isinstance(dict_data[k], dict):

tmp = chris_dumps(dict_data[k])

jar = jar+tmp

elif isinstance(dict_data[k], basestring):

jar = jar + "\""+dict_data[k]+"\""

else:

jar = jar + str(dict_data[k])

jar = jar + ", "

return jar[0:len(jar)-2]

#从str到objs

def chris_loads(data):

jar = {}

result = chris_loads_iter(data, jar)

return result

def chris_loads_iter(data, jar):

cnt = 0 # count brackets {:+1 }:-1

key = ""

val = ""

quote=False

colon = False # 冒号,False表示在冒号左边,True表示在右边

#for i in xrange(len(data)):

i=0

while i

if quote:

if data[i]=="\"": #右引号

if colon==False:

quote=False

else:

val += data[i]

else:

key += data[i]

else:

if data[i]=="\"": #左引号

if colon==False:

quote=True

key = ""

else:

val += data[i]

elif data[i]==":":

colon = True

elif data[i]=="," or data[i]=='}':

#jar[key]=eval(val) #干的漂亮!

jar[key]=eval(val)

val = ""

colon = False

elif data[i]==" ":

pass

elif data[i]=="{":

if colon==True :

j=i

subdata = ""

while data[j]!='}':

subdata += data[j]

j += 1

subdata += "}"

i=j+1

sub_result = chris_loads(subdata)

val=sub_result

jar[key]=sub_result

val = ""

colon = False

else:

val += data[i]

i += 1

return jar

写好了,测试一下:

if __name__ == "__main__":

s1={'name':'chris', 'age': 22}

s={'name':'chris', 'age':22, 'property': { 'id': 2011, 'lang': 'chinese'}}

t=chris_dumps(s)

g=s['property']

print 't:', t

q=chris_loads(t)

print 'q:', q

print type(q)

P.S.其实这个loads函数写的并不优美,正确的思路应当是画出状态自动机,列出每种情况以及各个情况之间的转化关系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值