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

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等的解析。 可以参考官方文档获取更多细节。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/505315.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络 --- 网络层路由算法与路由协议

路由表&#xff1a; 最佳路由&#xff1a; “最佳”只能是相对于某一种特定要求下得出的较为合理的选择而已。 路由算法的分类 静态路由算法&#xff08;非自适应路由算法&#xff09; 管理员手工配置路由信息。简便&#xff0c;可靠&#xff0c;在负荷稳定&#xff0c;拓扑…

同比 数据模型 环比_历史数据模型解决方案-历史数据模型解决方案

方案介绍针对上面介绍常规实现方案的弊端&#xff0c;本文从数据结构设计入手提出了“历史数据模型”解决方案。在物理表设计阶段针对这类报表问题进行特殊处理&#xff0c;物理表数据结构设计如下&#xff1a;字段描述IdIDProject项目Amount本月投资额TotalAmount累计投资额(截…

cplex安装_Excel软件规划求解工具的安装与功能介绍

引言规划求解工具是Excel软件中自带的一个功能非常强大的加载项/工具。它能够完成包括线性规划、整数线性规划等一般规模的数学优化问题的问题求解。更重要的是&#xff0c;无论是在Windows操作系统下&#xff0c;还是苹果电脑Mac平台下&#xff0c;这个工具都是免费的。下面就…

python二进制文件 删除尾部数据_在Python中读取和切片二进制数据文件的最快方法...

我有一个处理脚本,用于提取“uint16”类型的二进制数据文件,并一次以6400块的形式进行各种处理.该代码最初是用Matlab编写的,但由于分析代码是用 Python编写的,我们希望通过在Python中完成所有工作来简化流程.问题是我注意到我的Python代码比Matlab的fread函数慢得多.简单地说,…

计算机网络 --- 网络层IP数据报

IP数据报格式 首部 版本&#xff1a;IPv4/IPv6首部长度&#xff1a;单位是4B&#xff0c;最小为5。也就是说如果首部长度的四个bit的出来的数是8&#xff0c;那么首部长度就是8 * 4B 32B也就是32字节区分服务&#xff1a;指示期望获得哪种类型的服务总长度&#xff1a;首部数据…

线程管理(学习)

线程管理 在日常生活中&#xff0c;我们要完成一个大任务&#xff0c;一般会将它分解成多个简单、容易解决的小问题&#xff0c;小问题逐个被解决&#xff0c;大问题也就随之解决了。 在多线程操作系统中&#xff0c;也同样需要开发人员把一个复杂的应用分解成多个小的、可调…

imread函数_MATLAB图像处理:27:使用imtranslate函数平移图像

本示例说明如何使用imtranslate函数对图像执行平移操作。平移操作将图像在x或y方向或两者上移动指定数量的像素。将图像读入工作区。I imread(cameraman.tif);显示图像。图像的大小为256 x 256像素。默认情况下&#xff0c;imshow显示图像的左上角坐标为&#xff08;0,0&#…

ads design environment_ADS应用技巧3 — 画一个巴伦有多少种方法?

为什么ADS的Schematic不允许多任务仿真(即如果一个Schematic的仿真任务没完成&#xff0c;就不允许任何Schematic启动新的仿真)&#xff1b;而Layout却允许同时运行一大堆EM仿真。按理说&#xff0c;Schematic仿真相比于EM仿真占用更少的CPU和RAM等计算机资源&#xff0c;更应该…

计算机网络 --- 网络层IP地址

全世界唯一的32位/4字节标识符&#xff0c;标识路由器主机的接口。 IP地址&#xff1a;&#xff1a; {<网络号><主机号>} IP编址的历史阶段 分类的IP地址子网的划分构成超网&#xff08;无分类编址方法&#xff09; 分类的IP地址 特殊IP地址 私有IP地址 网络地址…

3测试图片显示置信度_云上的移动性能测试平台

1. 功能决定现在&#xff0c;性能决定未来性能测试在移动测试领域一直是一个大难题&#xff0c;它最直观的表现是用户在前台使用 App 时的主观体验&#xff0c;然而决定体验优劣的背后&#xff0c;涉及到了许许多多的技术变迁。当我们习惯于诺基亚时&#xff0c;智能机出现了&a…

计算机网络 --- 网络层重要协议

动态IP分配协议 --- DHCP协议 主机如何获得IP地址&#xff1a; 静态配置 包括IP地址&#xff0c;子网掩码&#xff0c;默认网关 动态配置 由DHCP服务器来分配 DHCP协议&#xff1a; 动态主机配置协议DHCP是应用层协议&#xff0c;使用客户、服务器方式&#xff0c;客户端和…

java 并发_Java并发防范机制

1.背景并发程序开发不可避免地要涉及多线程、多线程协作、数据共享和线程安全等问题。在多线程并发场景下&#xff0c;由于采用数据共享的线程通信模型可能导致多个线程之间并发时相互干扰&#xff0c;影响到程序的正常逻辑、无法保证正常的结果。为了保证程序在并发环境的正确…

水晶底是什么材质_都是红酒杯,水晶的和玻璃的有什么区别?

除了看酒杯的形状外&#xff0c;材质也是我们选酒杯不可忽视的一环。酒杯材质可简单分为玻璃酒杯和水晶酒杯。那么&#xff0c;水晶酒杯和玻璃酒杯到底有何不同&#xff1f;普通玻璃杯二氧化硅是主要成分&#xff0c;价格低廉&#xff0c;容易清洗普通玻璃酒杯材质较厚&#xf…

计算机网络 --- 网络层

主要任务是把分组从源端传到目的端&#xff0c;为分组交换网上的不同主机提供通信服务。网络层的传输单位是数据报。&#xff08;分组是把数据报进行切割形成&#xff09; 网络层主要功能 路由选择与分组转发异构网络互联拥塞控制 如果所有结点都来不及接收分组&#xff0…

mac 串口调试工具_MACamp;串口调试

上一篇文章讲了Mac下进行stm32开发wlzz&#xff1a;Mac下stm32开发(clion)​zhuanlan.zhihu.com不可避免的遇到了串口调试的问题,发现mac下进行串口调试还真的不太容易。下了不少网上的软件,发现都不是特别好用,有很多已经不支持现在的macos系统版本了。于是在CLion下搜索了一下…

golang atomic load 性能_设计模式之Golang单例模式

今天给大家讲下什么是单例模式&#xff0c;以及在Go语言中如何用正确的姿势实现它。其实单例模式是一种在平时开发中经常用到的软件设计模式。在设计模式结构中&#xff0c;其核心是只包含一个被称为单例的特殊类。通过单例模式可以确保系统中一个类只有一个实例&#xff0c;且…

计算机网络 --- 传输层

传输层概述 传输层是只有主机才有的层次&#xff08;路由器没有&#xff09;&#xff0c;为应用层提供通信服务&#xff0c;使用网络层的服务 传输层的功能 传输层提供进程与进程之间的逻辑通信&#xff08;网络层提供主机之间的逻辑通信&#xff09;。复用和分用传输层对收…

手机相机里面的m_荣耀V30 PRO详细评测:Matrix Camera相机矩阵开启5G视频时代

【IT168 评测】随着手机摄像头的配置越来越高&#xff0c;手机上已经能实现不俗的拍照效果&#xff0c;甚至超越了数码相机(DC)成为了人们最常用的拍照工具。进入今年的下半年&#xff0c;随着5G的商用&#xff0c;手机厂商对于手机的摄像头功能优化已经不局限于拍照&#xff0…

计算机网络 --- 传输层UDP协议

UDP只在IP数据报服务之上增加了很少功能&#xff0c;即复用分用和差错检测功能。 UDP的主要特点 UDP是无连接的&#xff0c;减少开销和发送数据之前的时延。UDP使用最大努力交付&#xff0c;即不保证可靠交付。UDP是面向报文的&#xff0c;适合一次性传输少量数据的网络应用。…

怎么调整字段长短_【芝士蛋糕怎么总烤不熟呢?】

烘焙群一位同学发来图片问&#xff0c;不是说看蛋糕有没有烤熟&#xff0c;要用牙签检测吗&#xff1f;可我这个芝士蛋糕&#xff0c;怎么扎都会带出面糊&#xff0c;烤不熟怎么办&#xff1f;看到这个被扎成刺猬的舒芙蕾芝士&#xff0c;原谅Windy 不厚道的笑了。也是Windy 疏…