博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python中的json操作
阅读量:4565 次
发布时间:2019-06-08

本文共 2153 字,大约阅读时间需要 7 分钟。

Python中的json操作

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


字符串前缀问题

字符串前缀可以有r,u

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

u:表示unicode字符串。

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

发生问题的一个场景是:从某个url抓取json格式数据,import了python自带的jsonsimplejson包,调用其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-8import types#从obj到strdef 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到objsdef chris_loads(data):    jar = {}    result = chris_loads_iter(data, jar)    return resultdef 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 __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函数写的并不优美,正确的思路应当是画出状态自动机,列出每种情况以及各个情况之间的转化关系。

转载于:https://www.cnblogs.com/zjutzz/p/4584704.html

你可能感兴趣的文章
Sublimetext3安装Emmet插件步骤
查看>>
MySQL配置参数
查看>>
全面理解Java内存模型
查看>>
A - Mike and palindrome
查看>>
DOTween教程
查看>>
java web中java和python混合使用
查看>>
创建学员类和教员类
查看>>
Cookie和Session的作用和工作原理
查看>>
字符串操作
查看>>
Visual Studio中改变environment 的布局和显示风格
查看>>
2016-XCTF Final-Richman
查看>>
文件下载
查看>>
extjs grid renderer用法
查看>>
vue 如何在循环中绑定v-model
查看>>
shell脚本
查看>>
[代码笔记]JS保持函数单一职责,灵活组合
查看>>
cmd 重定向
查看>>
【IOS开发】如何画1像素的线
查看>>
【计算机视觉】双目测距(五)--匹配算法对比
查看>>
KMP模板
查看>>