python中json操作了解
- 什么是接口?
交换数据
http://openweathermap.org/current
- json简介
JSON 是存储和交换文本信息的语法。类似 XML
JSON 语法是 JavaScript 语法的子集
- Json语法规则
数据在名称、值对中
数据由逗号分隔
花括号保存对象
方括号保存数组
Json的值可以是:
数字(整数或浮点数)
字符串(在双括号中)
逻辑值(true或false)
数组(在方括号中)
对象(在花括号中)
Null
- json串转换
Python的json模块序列化和反序列化分别是dumps和loads。
➢json.dumps():将一个Python对象编码成JSON字符串。
➢json.loads():将JSON格式字符串解码成Python对象。
>>> import json
>>> json.dumps({1:2})
'{"1": 2}'
>>> json.dumps({"a":2})
'{"a": 2}'
>>> json.dumps({True:2})
'{"True": 2}'
>>> print type(json.dumps({True:2}))
<type 'str'>
字典的key会默认转成字符串,整个类型其实就是字符串类型。
>>> json.dumps((1,2,3))
'[1, 2, 3]'
>>> json.dumps((1))
'1'
>>> json.dumps([1,2,3])
'[1, 2, 3]'
>>> json.dumps(True)
'true'
>>> json.dumps(False)
'false'
>>> json.dumps(None)
'null'
>>> json.dumps("abc")
'"abc"'
>>> json.dumps([{"a":1,"b":1}])
'[{"a": 1, "b": 1}]'
>>> json.dumps([{"a":1,"b":1},{"c":3}])
'[{"a": 1, "b": 1}, {"c": 3}]'
>>>
转换字典类型的最为常用。
整体练习例子:
#coding=utf-8
import json
a = [{1:12, 'a':12.3}, [1,2,3], (1,2), 'asd', u'ad', 12, 13L, 3.3, True, False, None]
print u"Python类型:\n", a
print u"编码后的json串:\n", json.dumps(a)
- json.dumps() 加sortkey的作用: 是否按字典排序(a到z)输出。因为默认编码成json格式字符串后,是紧凑输出,并且也没有顺序的,不利于可读。
#coding=utf-8
import json
data = [ { 'a':'A', 'b':(2, 4), 'c':3.0 }]
print json.dumps(data)
print json.dumps(data, sort_keys=True)
结果:
E:\>python a.py
[{"a": "A", "c": 3.0, "b": [2, 4]}]
[{"a": "A", "b": [2, 4], "c": 3.0}]
- json.dumps() indent设置参数缩进显示的空格数,控制输出格式。
#coding=utf-8
import json
data = [{"a": "A", "b": [2, 4], "c": 3.0}]
print json.dumps(data, sort_keys=True, indent=3)
这里的缩进是每行都有的
- json.dumps() separator作用是去掉逗号“ ,” 和分号“ :” 后面的空格
#coding=utf-8
import json
data = [{"a": "A", "b": [2, 4], "c": 3.0}]
print len(json.dumps(data))
# 去掉编码后的json串中,和:后面的空格
print len(json.dumps(data, separators=(',',':')))
- json.dumps() skipkeys在encoding过程中,dict对象的key只可以是基本数据类型(str,unicode,int,long,float,bool,None),如果是其他类型,那么在编码过程中就会抛出TypeError的异常。 skipkeys可以跳过那些非string对象的key的处理,就是不处理。
#coding=utf-8
import json
data= [ { 'a':'A', 'b':(2, 4), 'c':3.0, (1,2):'D tuple' } ]
print u"不设置skipkeys 参数"
try :
res1 = json.dumps(data) #skipkeys参数默认为False时
except Exception, e:
print e
print u"设置skipkeys 参数"
print json.dumps(data, skipkeys=True)# skipkeys=True时
- dumps()的作用,由于python只在自己的编译环境中有效,这里用dumps()把python的对象转换成服务器能够识别的字符串。
- json.loads 将简单数据类型解码成python
#coding=utf-8
import json
data = [{'a':"Aasdf",'b':(2,4),'c':3.0}]
data_json = json.dumps(data)
print "encoding :", data_json
print "decoding :", json.loads(data_json)
结果:
E:\>python a.py
encoding : [{"a": "Aasdf", "c": 3.0, "b": [2, 4]}]
decoding : [{u'a': u'Aasdf', u'c': 3.0, u'b': [2, 4]}]
结果中的unicode怎么转换成string类型?
方法一:直接str()
>>> type(str(u"a"))
<type 'str'>
方法二:encode
>>> type(u"a".encode("gbk"))
<type 'str'>
小练习:
encoding : [{"a": "Aasdf", "c": 3.0, "b": [2, 4]}]
decoding : [{u'a': u'Aasdf', u'c': 3.0, u'b': [2, 4]}]
如何把decoding中的u去掉?
老师的方法:
#coding=utf-8
import json
data = [{'a':"Aasdf",'b':(2,4),'c':3.0}]
data_json = json.dumps(data)
print "encoding :", data_json
print "decoding :", json.loads(data_json)
s= json.loads(data_json)
d=s[0]
new_d={}
new_list=[]
for k,v in d.items():
if isinstance(v,unicode):
new_d[str(k)]=str(v)
else:
new_d[str(k)]=v
new_list.append(new_d)
print new_list
同学的方法:更严谨的判定逻辑
for key,value in dict_a.items():
if isinstance(key,unicode) and isinstance(value,unicode):
result[str(key)]=str(value)
elif isinstance(key,unicode) and not isinstance(value,unicode):
result[str(key)]=value
elif not isinstance(key,unicode) and isinstance(value,unicode):
result[key]=str(value)
elif not isinstance(key,unicode) and not isinstance(value,unicode):
result[key]=value
return result
- Json到python类型转换:转换回来的类型中是没有tuple的,转换后都是unicode类型。
>>> json.loads('1')
1
>>> json.loads('{"a":"1"}')
{u'a': u'1'}
>>> json.loads('["1","2"]')
[u'1', u'2']
>>> json.loads('1.2')
1.2
>>> json.loads('true')
True
>>> json.loads('false')
False
>>> json.loads('null')
>>> type(json.loads('null'))
例题:json转python
#coding=utf-8
import json
a = [{1:12, 'a':12.3}, [1,2,3], (1,2), 'asd', u'ad', 12, 13L, 3.3, True, False, None]
print u"编码后\n", json.dumps(a)
print u"解码后\n", json.loads(json.dumps(a))
结果:
E:\>python a.py
编码后
[{"a": 12.3, "1": 12}, [1, 2, 3], [1, 2], "asd", "ad", 12, 13, 3.3, true, false,null]
解码后
[{u'a': 12.3, u'1': 12}, [1, 2, 3], [1, 2], u'asd', u'ad', 12, 13, 3.3, True, False, None]
- 将类对象转换成json串
方法一:
#encoding=utf-8
import json
class Employee(object):
def __init__(self, name, age, sex, tel):
self.name = name
self.age = age
self.sex = sex
self.tel = tel
# 将序列化函数定义到类里面
def obj_json(self, obj_instance):
return {
'name': obj_instance.name,
'age': obj_instance.age,
'sex': obj_instance.sex,
'tel': obj_instance.tel
}
emp = Employee('Lily', 24, 'female', '18223423423') 返回成一个字典
print json.dumps(emp, default = emp.obj_json)
结果:
E:\>python a.py
{"age": 24, "tel": "18223423423", "name": "Lily", "sex": "female"}
方法一中的类变形:
#encoding=utf-8
import json
class Employee(object):
def __init__(self, name, age, sex, tel):
self.name = name
self.age = age
self.sex = sex
self.tel = tel
# 将序列化函数定义到类里面
def obj_json(self):
return {
'name': self.name ,
'age': self.age,
'sex': self.sex,
'tel': self.tel
}
emp = Employee('Lily', 24, 'female', '18223423423')
print json.dumps(emp.obj_json())
方法二:先转成dict,然后再被序列化成json串。
#encoding=utf-8
import json
class Employee(object):
def __init__(self, name, age, sex, tel):
self.name = name
self.age = age
self.sex = sex
self.tel = tel
emp = Employee('Lily', 24, 'female', '18223423423')
print emp.__dict__
print(json.dumps(emp, default = lambda Employee: Employee.__dict__))
print(json.dumps(emp, default = lambda emp: emp.__dict__))
结果:
E:\>python a.py
{'age': 24, 'tel': '18223423423', 'name': 'Lily', 'sex': 'female'}
{"age": 24, "tel": "18223423423", "name": "Lily", "sex": "female"}
{"age": 24, "tel": "18223423423", "name": "Lily", "sex": "female"}
- json反序列化为类对象
#encoding=utf-8
import json
class Employee(object):
def __init__(self, name, age, sex, tel):
self.name = name
self.age = age
self.sex = sex
self.tel = tel
emp = Employee('Lily', 24, 'female', '18223423423')
def jsonToClass(emp):
return Employee(emp['name'], emp['age'], emp['sex'], emp['tel'])
json_str = '{"name": "Lucy", "age": 21, "sex": "female", "tel": "15834560985"}'
e = json.loads(json_str, object_hook = jsonToClass)
print e
print e.name
object_hook = jsonToClass 命名参数传递
结果:
E:\>python a.py
<__main__.Employee object at 0x01AF5970>
Lucy
python中json操作了解的更多相关文章
- python中json操作
1.写操作.json文件dumps().dump()函数 d = { 'zll': { 'addr': '北京', 'age': 28 }, 'ljj': { 'addr': '北京', 'age': ...
- Python中json的简单读写操作
Python中json的简单读写操作 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的 ...
- Neo4j:图数据库GraphDB(四)Python中的操作
本文总结下Python中如何操作Neo4j数据库,用到py2neo包,Pip install 一下. 1 连接neo4j数据库:跟其它数据库一样,操作前必须输入用户名和密码及地址连接一下. from ...
- python中json格式数据输出实现方式
python中json格式数据输出实现方式 主要使用json模块,直接导入import json即可. 小例子如下: #coding=UTF-8 import json info={} info[&q ...
- python中文件操作的六种模式及对文件某一行进行修改的方法
一.python中文件操作的六种模式分为:r,w,a,r+,w+,a+ r叫做只读模式,只可以读取,不可以写入 w叫做写入模式,只可以写入,不可以读取 a叫做追加写入模式,只可以在末尾追加内容,不可以 ...
- python中文件操作的其他方法
前面介绍过Python中文件操作的一般方法,包括打开,写入,关闭.本文中介绍下python中关于文件操作的其他比较常用的一些方法. 首先创建一个文件poems: p=open('poems','r', ...
- python MySQLdb用法,python中cursor操作数据库(转)
数据库连接 连接数据库前,请先确认以下事项: 您已经创建了数据库 TESTDB. 在TESTDB数据库中您已经创建了表 EMPLOYEE EMPLOYEE表字段为 FIRST_NAME, LAST_N ...
- (数据科学学习手札126)Python中JSON结构数据的高效增删改操作
本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在上一期文章中我们一起学习了在Python ...
- python中json的操作示例
先上一段示例 # -*- coding: cp936 -*- import json #构造一个示例数据,并打印成易读样式 j = {} j["userName"]="a ...
随机推荐
- placeholder的兼容处理方法
placeholder是html5新增的一个属性,极大的减轻了表单提示功能的实现,但是对于IE6-IE9真的是只能靠自己写啦! 但是在自己写时会掉进了一个坑里,还好用了一会时间还是爬出来啦. 最终的解 ...
- Linux常用操作详解
第1章 Linux命令基础 1.1 习惯 操作前备份,操作后检查 1.2 简单目录结构 一切从根开始,与windows不同 1.3 规则 [root@znix ~]# [用户名@主机名 你在哪]# 1 ...
- SDOI 2018二轮题解(除Day2T1)
博主诈尸啦 虽然一轮之后就退役了但是二轮还是要去划划水呀~ 然鹅学了不到一个月文化课再回来看OI的东西有一种恍如隔世的感觉,烤前感觉也没啥可复习的,就补一补去年二轮的题吧. 题目思路基本都参考自sha ...
- Jquery 事件 DOM操作
常规事件: 把JS的事件 on去掉即可 例如:js document.getElementById("id").onclinck=function(){} Jquery ...
- ZOJ 3469 Food Delivery (区间DP,经典)
题意: 在x轴上有一家外卖餐馆,有n个顾客站在x轴上不同坐标上且叫了外卖,每个人的脾气不同,每1分钟没有收到外卖就会增加Fi点愤怒值,而外卖小哥的车是有速度的v-1/分钟,问怎样的送餐次序会让所有顾客 ...
- 【Python图像特征的音乐序列生成】关于图像特征的描述词
查阅了很久的资料,决定依据Yoshida的<Image retrieval system using impression words>这篇论文里的词语来定义. Yoshida 等的 Ar ...
- 检查EXE、DLL、SYS等文件是32位还是64位的
非.NET文件用:dumpbin.exe /headers file.exe(C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin) . ...
- CodeForces 66C Petya and File System (实现)
模拟题,map搞一搞.要想清楚一个结点应该是要通过一个字符串找到下一个结点,题目保证所以文件夹非空,所以只要判断一个结点是不是叶子结点就可以判断它是不是文件,用了点c11的特性. #include&l ...
- CF Gym 100637F The Pool for Lucky Ones
题意:给你一串非负整数,可以将一个非零数减1,加到相邻的数字上,要使其中所有最大数字的和最小. 题解:模拟可以过.也可以分析,可以要减少最大数字和,如果最大数字出现大于等于3次,可以把最大数字加一,或 ...
- Java 集合框架_下
Map接口 特点: [1]Map接口称为键值对集合或者映射集合,其中的元素(entry)是以键值对(key-value)的形式存在. [2]Map 容器接口中提供了增.删.改.查的方式对集合进行操作. ...