JSON编码支持的基本数据类型为 None , bool , int , float 和 str , 以及包含这些类型数据的lists,tuples和dictionaries。 对于dictionaries,keys需要是字符串类型(字典中任何非字符串类型的key在编码时会先转换为字符串)。 为了遵循JSON规范,你应该只编码Python的lists和dictionaries。 而且,在web应用程序中,顶层对象被编码为一个字典是一个标准做法。

JSON编码的格式对于Python语法而已几乎是完全一样的,除了一些小的差异之外。 比如,True会被映射为true,False被映射为false,而None会被映射为null。 下面是一个例子,演示了编码后的字符串效果:

>>> json.dumps(False)

'false'

>>> d = {'a': True,

... 'b': 'Hello',

... 'c': None}

>>> json.dumps(d)

'{"b": "Hello", "c": null, "a": true}'

>>>

如果你试着去检查JSON解码后的数据,你通常很难通过简单的打印来确定它的结构, 特别是当数据的嵌套结构层次很深或者包含大量的字段时。 为了解决这个问题,可以考虑使用pprint模块的 pprint() 函数来代替普通的 print() 函数。 它会按照key的字母顺序并以一种更加美观的方式输出。 下面是一个演示如何漂亮的打印输出Twitter上搜索结果的例子:

>>> from urllib.request import urlopen

>>> import json

>>> u = urlopen('http://search.twitter.com/search.json?q=python&rpp=5')

>>> resp = json.loads(u.read().decode('utf-8'))

>>> from pprint import pprint

>>> pprint(resp)

{'completed_in': 0.074,

'max_id': 264043230692245504,

'max_id_str': '264043230692245504',

'next_page': '?page=2&max_id=264043230692245504&q=python&rpp=5',

'page': 1,

'query': 'python',

'refresh_url': '?since_id=264043230692245504&q=python',

'results': [{'created_at': 'Thu, 01 Nov 2012 16:36:26 +0000',

'from_user': ...

},

{'created_at': 'Thu, 01 Nov 2012 16:36:14 +0000',

'from_user': ...

},

{'created_at': 'Thu, 01 Nov 2012 16:36:13 +0000',

'from_user': ...

},

{'created_at': 'Thu, 01 Nov 2012 16:36:07 +0000',

'from_user': ...

}

{'created_at': 'Thu, 01 Nov 2012 16:36:04 +0000',

'from_user': ...

}],

'results_per_page': 5,

'since_id': 0,

'since_id_str': '0'}

>>>

一般来讲,JSON解码会根据提供的数据创建dicts或lists。 如果你想要创建其他类型的对象,可以给 json.loads() 传递object_pairs_hook或object_hook参数。 例如,下面是演示如何解码JSON数据并在一个OrderedDict中保留其顺序的例子:

>>> s = '{"name": "ACME", "shares": 50, "price": 490.1}'

>>> from collections import OrderedDict

>>> data = json.loads(s, object_pairs_hook=OrderedDict)

>>> data

OrderedDict([('name', 'ACME'), ('shares', 50), ('price', 490.1)])

>>>

下面是如何将一个JSON字典转换为一个Python对象例子:

>>> class JSONObject:

... def __init__(self, d):

... self.__dict__ = d

...

>>>

>>> data = json.loads(s, object_hook=JSONObject)

>>> data.name

'ACME'

>>> data.shares

50

>>> data.price

490.1

>>>

最后一个例子中,JSON解码后的字典作为一个单个参数传递给 __init__() 。 然后,你就可以随心所欲的使用它了,比如作为一个实例字典来直接使用它。

在编码JSON的时候,还有一些选项很有用。 如果你想获得漂亮的格式化字符串后输出,可以使用 json.dumps() 的indent参数。 它会使得输出和pprint()函数效果类似。比如:

>>> print(json.dumps(data))

{"price": 542.23, "name": "ACME", "shares": 100}

>>> print(json.dumps(data, indent=4))

{

"price": 542.23,

"name": "ACME",

"shares": 100

}

>>>

对象实例通常并不是JSON可序列化的。例如:

>>> class Point:

... def __init__(self, x, y):

... self.x = x

... self.y = y

...

>>> p = Point(2, 3)

>>> json.dumps(p)

Traceback (most recent call last):

File "", line 1, in

File "/usr/local/lib/python3.3/json/__init__.py", line 226, in dumps

return _default_encoder.encode(obj)

File "/usr/local/lib/python3.3/json/encoder.py", line 187, in encode

chunks = self.iterencode(o, _one_shot=True)

File "/usr/local/lib/python3.3/json/encoder.py", line 245, in iterencode

return _iterencode(o, 0)

File "/usr/local/lib/python3.3/json/encoder.py", line 169, in default

raise TypeError(repr(o) + " is not JSON serializable")

TypeError: <__main__.Point object at 0x1006f2650> is not JSON serializable

>>>

如果你想序列化对象实例,你可以提供一个函数,它的输入是一个实例,返回一个可序列化的字典。例如:

def serialize_instance(obj):

d = { '__classname__' : type(obj).__name__ }

d.update(vars(obj))

return d

如果你想反过来获取这个实例,可以这样做:

# Dictionary mapping names to known classes

classes = {

'Point' : Point

}

def unserialize_object(d):

clsname = d.pop('__classname__', None)

if clsname:

cls = classes[clsname]

obj = cls.__new__(cls) # Make instance without calling __init__

for key, value in d.items():

setattr(obj, key, value)

return obj

else:

return d

下面是如何使用这些函数的例子:

>>> p = Point(2,3)

>>> s = json.dumps(p, default=serialize_instance)

>>> s

'{"__classname__": "Point", "y": 3, "x": 2}'

>>> a = json.loads(s, object_hook=unserialize_object)

>>> a

<__main__.Point object at 0x1017577d0>

>>> a.x

2

>>> a.y

3

>>>

json 模块还有很多其他选项来控制更低级别的数字、特殊值如NaN等的解析。 可以参考官方文档获取更多细节。

python json模块详解_深入解析Python编程中JSON模块的使用相关推荐

  1. python 描述器 详解_深入解析Python中的descriptor描述器的作用及用法

    一般来说,一个描述器是一个有"绑定行为"的对象属性(object attribute),它的访问控制被描述器协议方法重写.这些方法是 __get__(), __set__(), 和 ...

  2. python学习详解_深入解析Python小白学习【操作列表】

    1.遍历列表 需要对列表中的每个元素都执行相同的操作时,可使用for 循环: magicians = ['alice','david','carolina'] for magician in magi ...

  3. python之sys模块详解_(转)python之os,sys模块详解

    python之sys模块详解 原文:http://www.cnblogs.com/cherishry/p/5725184.html sys模块功能多,我们这里介绍一些比较实用的功能,相信你会喜欢的,和 ...

  4. python json方法详解_详解python中的json的基本使用方法

    在Python中使用json的时候,主要也就是使用json模块,json是以一种良好的格式来进行数据的交互,从而在很多时候,可以使用json数据格式作为程序之间的接口. #!/usr/bin/env ...

  5. python six模块详解_对python中的six.moves模块的下载函数urlretrieve详解

    实验环境:windows 7,anaconda 3(python 3.5),tensorflow(gpu/cpu) 函数介绍:所用函数为six.moves下的urllib中的函数,调用如下urllib ...

  6. python的抽象类详解_第7.19节 Python中的抽象类详解:abstractmethod、abc与真实子类...

    第7.19节 Python中的抽象类详解:abstractmethod.abc与真实子类 一. 引言 前面相关的章节已经介绍过,Python中定义某种类型是以实现了该类型对应的协议为标准的,而不是以继 ...

  7. python协程详解_对Python协程之异步同步的区别详解

    一下代码通过协程.多线程.多进程的方式,运行代码展示异步与同步的区别. import gevent import threading import multiprocessing # 这里展示同步和异 ...

  8. python input函数详解_对Python3中的input函数详解

    下面介绍python3中的input函数及其在python2及pyhton3中的不同. python3中的ininput函数,首先利用help(input)函数查看函数信息: 以上信息说明input函 ...

  9. python中的import详解_如何在python中import

    用法 1.import同一个路径下的.py文件. 这是import关键字最基本的用法,import moudle1可以理解为直接将module1.py的语句复制到对应的代码段. 2.import pa ...

最新文章

  1. 巴菲特:买进你同学的10%
  2. 汇总|三维重建开源项目
  3. Python使用matplotlib可视化面积图(Area Chart)、通过给坐标轴和曲线之间的区域着色可视化面积图、在面积图的指定区域添加箭头和数值标签
  4. java 判断一个数字是2倍数_如何判断语言发育迟缓的原因|一个2岁半不会说话的案例...
  5. android:layout_weight的真实含义
  6. tomcat容器是如何创建servlet类实例?用到了什么原理?
  7. python packages_Python-Packages
  8. OpenResty安装--增强版的nginx
  9. 兄弟连区块链教程Fabric1.0源代码分析Peer peer根命令入口及加载子命令一
  10. 不忘本~explicit和implicit修饰符
  11. 阿里云服务器 window server tomcat启动 并且关闭window防火墙 配置8080端口开放还是没用
  12. 太和二中计算机考试,安徽省太和二中高二数学下册期末考试试题精选
  13. oracle表的管理,Oracle表的管理
  14. PAT甲级1024 ASCII码与整数转换
  15. System.IO.Ports.SerialPort串口通信接收完整数据
  16. python学生信息管理系统 实验报告_Python学生信息管理系统的开发
  17. ubuntu 11.10 安装RTX 腾讯通
  18. Snipaste 屏幕截图软件超级利器
  19. 【C++要笑着学】缺省参数 | 全缺省与半缺省 | 函数重载
  20. 抖音小姐姐太好看了,我用Python把视频全部爬取下来

热门文章

  1. ic 卡获取帐号apdu指令_非接触IC卡片APDU指令系统介绍..docx
  2. word2016 图片去底灰_看来看去,还是高级灰最耐看,喜欢现代简约风的你,选它准不会错...
  3. qt中的mysql能存入多少行数据_Qt中提高sqlite的读写速度(使用事务一次性写入100万条数据)...
  4. )类 新建javafx程序时_第三章 第一个OpenCV的JavaFX应用程序.md
  5. C++中派生类隐式调用与显式调用基类的构造函数
  6. 使用matplotlib画图时不能同时打开太多张图
  7. 单片机实验-定时中断
  8. WordPress环境配置与安装
  9. Java中泛型 Class<T>、T与Class<?>、 Object类和Class类、 object.getClass() 和 Object.class
  10. [转载] --- 数据库基本知识