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-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操作的更多相关文章

  1. python中的 json 模块使用

    (1)python 中生成 json 字符串: import json data = dict(ret=0, msg="Welcome, Login success!") json ...

  2. python中的赋值操作和复制操作

    之前一直写C#,变量之间赋值相当于拷贝,修改拷贝变量不会改变原来的值.但是在python中发现赋值操作本质是和C++中的引用类似,即指向同一块内存空间.下面通过一个例子说明: p=[0,1,2,3,4 ...

  3. python中的赋值操作

    参考:https://www.cnblogs.com/andywenzhi/p/7453374.html?tdsourcetag=s_pcqq_aiomsg(写的蛮好) python中的赋值操作“=” ...

  4. python中的日志操作和发送邮件

    1.python中的日志操作 安装log模块:pip install nnlog 参数:my_log = nnlog.Logger('server_log.log',level='debug',bac ...

  5. 在 Python 中使用 JSON

    在 Python 中使用 JSON 本教程将会教我们如何使用 Python 编程语言编码和解码 JSON.让我们先来准备环境以便针对 JSON 进行 Python 编程. 环境 在我们使用 Pytho ...

  6. 【python】python中的json、字典dict

    定义 python中,json和dict非常类似,都是key-value的形式,而且json.dict也可以非常方便的通过dumps.loads互转.既然都是key-value格式,为啥还需要进行格式 ...

  7. 使用Json.Net解决MVC中各种json操作

    最近收集了几篇文章,用于替换MVC中各种json操作,微软mvc当然用自家的序列化,速度慢不说,还容易出问题,自定义性也太差,比如得特意解决循环引用的问题,比如datetime的序列化格式,比如性能. ...

  8. python中OS模块操作文件和目录

    在python中执行和操作目录和文件的操作是通过内置的python OS模块封装的函数实现的. 首先导入模块,并查看操作系统的类型: >>> import os os.name # ...

  9. Python中的字符串操作总结(Python3.6.1版本)

    Python中的字符串操作(Python3.6.1版本) (1)切片操作: str1="hello world!" str1[1:3] <=> 'el'(左闭右开:即是 ...

随机推荐

  1. tomcat7.x远程命令执行(CVE-2017-12615)漏洞漏洞复现

    tomcat7.x远程命令执行(CVE-2017-12615)漏洞漏洞复现 一.漏洞前言 2017年9月19日,Apache Tomcat官方确认并修复了两个高危漏洞,漏洞CVE编号:CVE-2017 ...

  2. Codeforces Round #417 (Div. 2)A B C E 模拟 枚举 二分 阶梯博弈

    A. Sagheer and Crossroads time limit per test 1 second memory limit per test 256 megabytes input sta ...

  3. Codeforces 894.B Ralph And His Magic Field

    B. Ralph And His Magic Field time limit per test 1 second memory limit per test 256 megabytes input ...

  4. 使用cron命令配置定时任务(cron jobs)

    原文 http://www.cnblogs.com/end/archive/2012/02/21/2361741.html 开机就启动cron进程的设置命令:chkconfig --add crond ...

  5. 题解 P1682 【过家家】

    P1682 过家家 题目描述 有2n个小学生来玩过家家游戏,其中有n个男生,编号为1到n,另外n个女生,编号也是1到n.每一个女生可以先选择一个和她不吵嘴的男生来玩,除此之外,如果编号为X的女生的朋友 ...

  6. mysql 修改密码的几种方式

    第一种方式: 最简单的方法就是借助第三方工具Navicat for MySQL来修改,方法如下: 1.登录mysql到指定库,如:登录到test库. 2.然后点击上方“用户”按钮. 3.选择要更改的用 ...

  7. angular package.json中start build

    "start": "ng serve --host 0.0.0.0 --port 4200 --proxy-config proxy.conf.json", & ...

  8. 机器学习-kNN-数据归一化

    一.为什么需要数据归一化 不同数据之间因为单位不同,导致数值差距十分大,容易导致预测结果被某项数据主导,所以需要进行数据的归一化. 解决方案:将所有数据映射到同一尺度 二.最值归一化 normaliz ...

  9. python初步学习-python模块之 os

    os os 模块在运维工作中是很常用的一个模块.通过os模块调用系统命令.os模块可以跨平台使用. 在 import os的时候,建议使用import os而非from os import *.这样可 ...

  10. pythonif语句和循环语句

    1.if语句用法 # if语句用法(缩进相同的成为一个代码块) score=90 if score>=60: print("合格") print("OK" ...