1. 什么是接口?

交换数据

http://openweathermap.org/current

  1. json简介

JSON 是存储和交换文本信息的语法。类似 XML

JSON 语法是 JavaScript 语法的子集

  1. Json语法规则

数据在名称、值对中

数据由逗号分隔

花括号保存对象

方括号保存数组

Json的值可以是:

数字(整数或浮点数)

字符串(在双括号中)

逻辑值(true或false)

数组(在方括号中)

对象(在花括号中)

Null

  1. 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)

  1. 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}]

  1. 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)

这里的缩进是每行都有的

  1. 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=(',',':')))

  1. 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时

  1. dumps()的作用,由于python只在自己的编译环境中有效,这里用dumps()把python的对象转换成服务器能够识别的字符串。
  1. 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

  1. 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]

  1. 将类对象转换成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"}

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

  1. python中json操作

    1.写操作.json文件dumps().dump()函数 d = { 'zll': { 'addr': '北京', 'age': 28 }, 'ljj': { 'addr': '北京', 'age': ...

  2. Python中json的简单读写操作

    Python中json的简单读写操作 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的 ...

  3. Neo4j:图数据库GraphDB(四)Python中的操作

    本文总结下Python中如何操作Neo4j数据库,用到py2neo包,Pip install 一下. 1 连接neo4j数据库:跟其它数据库一样,操作前必须输入用户名和密码及地址连接一下. from ...

  4. python中json格式数据输出实现方式

    python中json格式数据输出实现方式 主要使用json模块,直接导入import json即可. 小例子如下: #coding=UTF-8 import json info={} info[&q ...

  5. python中文件操作的六种模式及对文件某一行进行修改的方法

    一.python中文件操作的六种模式分为:r,w,a,r+,w+,a+ r叫做只读模式,只可以读取,不可以写入 w叫做写入模式,只可以写入,不可以读取 a叫做追加写入模式,只可以在末尾追加内容,不可以 ...

  6. python中文件操作的其他方法

    前面介绍过Python中文件操作的一般方法,包括打开,写入,关闭.本文中介绍下python中关于文件操作的其他比较常用的一些方法. 首先创建一个文件poems: p=open('poems','r', ...

  7. python MySQLdb用法,python中cursor操作数据库(转)

    数据库连接 连接数据库前,请先确认以下事项: 您已经创建了数据库 TESTDB. 在TESTDB数据库中您已经创建了表 EMPLOYEE EMPLOYEE表字段为 FIRST_NAME, LAST_N ...

  8. (数据科学学习手札126)Python中JSON结构数据的高效增删改操作

    本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在上一期文章中我们一起学习了在Python ...

  9. python中json的操作示例

    先上一段示例 # -*- coding: cp936 -*- import json #构造一个示例数据,并打印成易读样式 j = {} j["userName"]="a ...

随机推荐

  1. 浅析HTML的元素类型及其转换

    大家都知道html是由标签元素组成的,在了解元素的类型转换之前,让我们先来了解一下html的元素类型. 一.html元素类型分为两种:块级元素和内联元素,内联元素又被称为行内元素.  常见的块级元素有 ...

  2. 撤销git pull命令

    比如:在master分支上执行了git pull命令,想回到pull之前分支所在的commit位置. 步骤一:用 git reflog master 查看master分支的历史变动记录,其中有一个就是 ...

  3. Windows无法停用设备,原因是某个程序正在使用它...

    有时候,当我们用完U盘需要弹出是,会出现“Windows无法停用设备,原因是某个程序正在使用它…”的黄色警告,很无奈.不过可以通过一些方法进行解决(win10版): 1. 打开“文件资源管理器”,选择 ...

  4. 如何远程连接Windows server上的MySQL服务

    废话不多说,直接开干 首先要打开服务器的MySQL端口号:3306(当然,也可以把服务器的防火墙直接关闭,不过不安全) 1.打开服务器管理器,有个高级安全Windows防火墙,下面有一个入站规则, 右 ...

  5. LeetCode 53题 最大子序和 -- JavaScript

    解题思路分析: 该题是在一个整数数组中找到一个和最大的连续子数组,并返回和值.那么如何找到一个和最大的连续子数组呢?我们知道,这肯定需要遍历数组才行:好,那我们就开始遍历数组.首先,我们初始化最大和 ...

  6. 简单的邮件发送mail.jar

    public class MailSender { final static Logger logger = Logger.getLogger(MailSender.class); /** * 发送简 ...

  7. 如何将字符串@“ abc123.xyz789”倒置

    #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { ...

  8. C++函数的默认参数补充

    1.函数定义时指定默认参数 在C++中,定义函数时可以给形参指定一个默认的值,这样调用函数时如果没有给这个形参赋值(没有对应的实参),那么就使用这个默认的值.也就是说,调用函数时可以省略有默认值的参数 ...

  9. k8s搭建WebUI--Dashborad管理界面

    k8s的webUI管理界面可以更好更直观更便捷的让我们去管理我们的k8s集群. 我们知道,由于某些原因我们无法直接拉取dashboard的镜像,但是国内有些人已经将镜像下载到dockerhub中可以给 ...

  10. 【python】python环境搭建

    本文主要用于记录python环境的搭建一些不常用的命令,其他的安装步骤在其他大师可以找到就不详细列出了.(注:以下操作都是在Ubuntu14.04LTS版本) 一.环境查询相关 1.查询当前pytho ...