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<len(data):
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函数写的并不优美,正确的思路应当是画出状态自动机,列出每种情况以及各个情况之间的转化关系。
Python中的json操作的更多相关文章
- python中的 json 模块使用
(1)python 中生成 json 字符串: import json data = dict(ret=0, msg="Welcome, Login success!") json ...
- python中的赋值操作和复制操作
之前一直写C#,变量之间赋值相当于拷贝,修改拷贝变量不会改变原来的值.但是在python中发现赋值操作本质是和C++中的引用类似,即指向同一块内存空间.下面通过一个例子说明: p=[0,1,2,3,4 ...
- python中的赋值操作
参考:https://www.cnblogs.com/andywenzhi/p/7453374.html?tdsourcetag=s_pcqq_aiomsg(写的蛮好) python中的赋值操作“=” ...
- python中的日志操作和发送邮件
1.python中的日志操作 安装log模块:pip install nnlog 参数:my_log = nnlog.Logger('server_log.log',level='debug',bac ...
- 在 Python 中使用 JSON
在 Python 中使用 JSON 本教程将会教我们如何使用 Python 编程语言编码和解码 JSON.让我们先来准备环境以便针对 JSON 进行 Python 编程. 环境 在我们使用 Pytho ...
- 【python】python中的json、字典dict
定义 python中,json和dict非常类似,都是key-value的形式,而且json.dict也可以非常方便的通过dumps.loads互转.既然都是key-value格式,为啥还需要进行格式 ...
- 使用Json.Net解决MVC中各种json操作
最近收集了几篇文章,用于替换MVC中各种json操作,微软mvc当然用自家的序列化,速度慢不说,还容易出问题,自定义性也太差,比如得特意解决循环引用的问题,比如datetime的序列化格式,比如性能. ...
- python中OS模块操作文件和目录
在python中执行和操作目录和文件的操作是通过内置的python OS模块封装的函数实现的. 首先导入模块,并查看操作系统的类型: >>> import os os.name # ...
- Python中的字符串操作总结(Python3.6.1版本)
Python中的字符串操作(Python3.6.1版本) (1)切片操作: str1="hello world!" str1[1:3] <=> 'el'(左闭右开:即是 ...
随机推荐
- 20165218 实验二 Java面向对象程序设计
实验二 Java面向对象程序设计 课程:java程序设计 姓名:赵冰雨 学号:20165218 指导教师:娄嘉鹏 实验日期:2018.4.16 实验密级:Java开发环境的熟悉 实验内容.步骤与体会: ...
- LibreOJ #541. 「LibreOJ NOIP Round #1」七曜圣贤(单调队列)
被以前自己瞎YY的东西坑了T T...单调队列的确是可以维护这种操作的.... 显然这题可以转化成维护不在车上的东西的最小值, 支持插入和删去最早出现的值,然后就可以用单调队列了T T #includ ...
- 【bzoj1022】小约翰的游戏John
Portal -->bzoj1022 Solution 这题其实是裸的反Nim,这里主要是为了写反Nim游戏的证明 首先给出反Nim(anti-nim)的定义和结论: [定义]桌子上 ...
- python基础----迭代器、生成器、协程函数及应用(面向过程实例)
一.什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退) 2.可迭代 ...
- 使用pt-ioprofile监控数据库io文件读写情况
我们在做IO密集型的应用程序的时候,比如MySQL数据库,通常系统的表现取决于workload的类型. 比如我们要调优,我们就必须非常清楚的知道数据的访问规律,收集到足够的数据,用来做调优的依据. 有 ...
- hihocoder 1509异或排序
描述 给定一个长度为 n 的非负整数序列 a[1..n] 你需要求有多少个非负整数 S 满足以下两个条件: (1).0 ≤ S < 2^60 (2).对于所有 1 ≤ i < n ,有 ( ...
- 「Vue」vue-cli 3.0集成sass/scss到vue项目
vue-cli 3提供了两种方式集成sass/scss: 创建项目是选择预处理器sass手动安装sass-loader创建项目选择预处理器sass$ vue create vuedemo? Pleas ...
- 在使用Hibernate save()方法的时候 报错: org.hibernate.exception.ConstraintViolationException:could not perform addBath
org.hibernate.exception.ConstraintViolationException:could not perform addBath 错误可能原因:实体属性的值与数据库字段类型 ...
- 【Android】完善Android学习(七:API 4.0.3)
备注:之前Android入门学习的书籍使用的是杨丰盛的<Android应用开发揭秘>,这本书是基于Android 2.2API的,目前Android已经到4.4了,更新了很多的API,也增 ...
- HDU 1072 Nightmare (广搜)
题目链接 Problem Description Ignatius had a nightmare last night. He found himself in a labyrinth with a ...