【Python3.5】读写JSON格式的数据

简介: 打开微信扫一扫,关注微信公众号【数据与算法联盟】 转载请注明出处:http://blog.csdn.net/gamer_gyt 博主微博:http://weibo.com/234654758 Github:https://github.

这里写图片描述
打开微信扫一扫,关注微信公众号【数据与算法联盟】

转载请注明出处: http://blog.csdn.net/gamer_gyt
博主微博: http://weibo.com/234654758
Github: https://github.com/thinkgamer


写在前边的话

由于最近在玩ELK数据分析,慢慢的对JSON格式的数据有了一些了解,之前只知道JSON是Javascript Object Notation编码格式的数据,且在web开发中的前后端数据传输时会大部分用的都是json格式的数据,那么接下来我们就好好看看python 对于 json格式数据的操作吧

本文永久地址:【python3.5】 读写JSON格式的数据


Json快速入门

json模块提供了一种很简单的方式来编码和解码json格式的数据,其中两个主要的函数是json.dumps()和json.loads(),当然与之对应的还要json.dump()和json.load()函数,下边先看几个例子帮你快速理解json

  • 将一个Python数据结构转化为json:
import json
data ={
   'name': 'thinkgamer',
   'age': 23,
   'sex': 'men'
}
json_str = json.dumps(data)
type(json_str)
#<class 'str'>
type(data)
#<class 'dict'>
  • 将一个JSON编码的字符串转换回一个Python数据结构:
new_data = json.loads(json_str)
type(new_data)
#<class 'dict'>

上边演示的是json.dumps()函数和json.loads()函数,但是如果你的操作对象是文件而不仅是python的数据结构呢,这个时候就要用到json.dump()和json.load()了。

>>> new_data = json.loads(json_str)
>>> type(new_data)
<class 'dict'>
>>> with open("data.json","w") as fw:
...     json.dump(data,fw)
... 
>>> import os
>>> os.system("cat data.json")
{"age": 23, "name": "thinkgamer", "sex": "men"}0
>>> with open("data.json","r") as fr:
...     data = json.load(fr)
...     print(data)
...     print(type(data))
... 
{'age': 23, 'name': 'thinkgamer', 'sex': 'men'}
<class 'dict'>

四个函数解释

json.dump()

json.dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding="utf-8", default=None, sort_keys=False, **kw)

    将obj序列化为JSON格式流到fp
    如果skipkeys为True (默认:False),然后并不是一种基本的类型 (str, unicode, int, long, float, bool, None) 的字典键将被跳过而不是抛出TypeError异常。
    如果ensure_ascii为True(默认值),则输出中的所有非ASCII字符都将使用uXXXX序列进行转义,并且结果是仅由ASCII字符组成的str实例。 如果ensure_ascii为False,写入fp的一些块可能是unicode实例。 这通常发生,因为输入包含unicode字符串或使用encoding参数。 除非fp.write()明确理解unicode(如codecs.getwriter()),这很可能导致错误。
    如果check_circuler设置为false(默认为true)对容器类型的循环引用检查将被跳过,然后循环的引用将导致OverflowError。
    若allow_nan为False(默认:True),那么它将是ValueError范围的浮点型值-inf inf nan) 从序列化 JSON 的规范,而不是使用 JavaScript 等价物严格按照 (NaN,无穷大, -无限)。
    cls:如果缩进是一个非负整数,那么 JSON 数组元素和对象成员将漂亮印有该缩进级别。缩进级别为 0,或负面的只能将插入换行符。没有一个(默认值) 选择的最紧凑的表示形式。
    indent:如果分隔符是(item_separator, dict_separator)元组),那么它将代替默认的(‘, ‘, ‘: ‘)分隔符。 (‘,’, ‘: ‘)是最紧凑的 JSON 表示
    encoding:编码的字符编码为 str 实例,默认为 utf-8
    default(obj)是 obj 的一个函数,它应该返回一个可序列化的版本或提高TypeError。默认值只是引发TypeError。
    如果sort_keys为True (默认:False),然后将按关键字排序字典的输出。

json.dumps()

json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding="utf-8", default=None, sort_keys=False, **kw)

    将Python的对象数据或者是str序列化为JSON格式,具体的参数含义如dump()函数

json.load()

json.load(fp[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])

    反序列化fp ( .read()-支持文件类似对象包含一个 JSON 文档) 到 Python 对象
    object_hook:可选函数,将调用任何对象文本解码的结果
    object_pairs_hook:可选函数,将调用任何的结果对象文本解码成对有序列表
    parse_float:如果指定,将使用每个 JSON float要解码的字符串调用。默认情况下,这是相当于float(num_str)。这可以用来使用另一种数据类型或解析 JSON float
    parse_int:如果指定,将使用每个 JSON int 要解码的字符串调用。默认情况下,这是相当于int(num_str)。这可以用来使用另一种数据类型或解析 JSON 整数
    parse_constant,如果指定,将调用以下字符串之一: ‘-无穷大 ‘, ‘无穷大’、 ‘null’。如果遇到无效的 JSON 格式时引发异常。

json.loads()

将包含json格式的文档序列化成Python的对象,其余参数同load()函数


几个小案例

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

>>> import os
>>> s= '{"name":"Think","share":50, "price":12}'
>>> from collections import OrderedDict
>>> data = json.loads(s, object_pairs_hook=OrderedDict)
>>> data
OrderedDict([('name', 'Think'), ('share', 50), ('price', 12)])
>>> type(data)
<class 'collections.OrderedDict'>

将一个JSON字典转换为一个Python对象例子

>>> class json_object:
...   def __init__(self,d):
...     self.__dict__ = d
... 
>>> data = json.loads(s, object_hook = json_object)
>>> data.name
'Think'
>>> data.share
50
>>> data.price
12

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

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

>>> print(json.dumps(data))
{"name": "Think", "shares": 50, "price": 12}
>>> print(json.dumps(data,indent=4))
{
    "name": "Think",
    "shares": 50,
    "price": 12
}

然而实例通常并不是可序列化的,例如

>>> 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 "<stdin>", line 1, in <module>
  File "/usr/lib/python3.5/json/__init__.py", line 230, in dumps
    return _default_encoder.encode(obj)
  File "/usr/lib/python3.5/json/encoder.py", line 198, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/lib/python3.5/json/encoder.py", line 256, in iterencode
    return _iterencode(o, 0)
  File "/usr/lib/python3.5/json/encoder.py", line 179, in default
    raise TypeError(repr(o) + " is not JSON serializable")
TypeError: <__main__.Point object at 0x7f2757f2f278> is not JSON serializable

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

>>> def serialize_instance(obj):
...     d = { '__classname__' : type(obj).__name__}
...     d.update(vars(obj))
...     return d
... 
>>> p = Point(2,3)
>>> json.dumps(p,default =serialize_instance)
'{"x": 2, "y": 3, "__classname__": "Point"}'

资料参考

http://python.usyiyi.cn/python_278/library/json.html
http://python3-cookbook.readthedocs.io/zh_CN/latest/c06/p02_read-write_json_data.html

相关文章
|
30天前
|
SQL 自然语言处理 数据库
【Azure Developer】分享两段Python代码处理表格(CSV格式)数据 : 根据每列的内容生成SQL语句
本文介绍了使用Python Pandas处理数据收集任务中格式不统一的问题。针对两种情况:服务名对应多人拥有状态(1/0表示),以及服务名与人名重复列的情况,分别采用双层for循环和字典数据结构实现数据转换,最终生成Name对应的Services列表(逗号分隔)。此方法高效解决大量数据的人工处理难题,减少错误并提升效率。文中附带代码示例及执行结果截图,便于理解和实践。
|
21天前
|
XML JSON API
淘宝商品详情API的调用流程(python请求示例以及json数据示例返回参考)
JSON数据示例:需要提供一个结构化的示例,展示商品详情可能包含的字段,如商品标题、价格、库存、描述、图片链接、卖家信息等。考虑到稳定性,示例应基于淘宝开放平台的标准响应格式。
|
1月前
|
JSON Java 数据格式
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——封装统一返回的数据结构
本文介绍了在Spring Boot中封装统一返回的数据结构的方法。通过定义一个泛型类`JsonResult&lt;T&gt;`,包含数据、状态码和提示信息三个属性,满足不同场景下的JSON返回需求。例如,无数据返回时可设置默认状态码&quot;0&quot;和消息&quot;操作成功!&quot;,有数据返回时也可自定义状态码和消息。同时,文章展示了如何在Controller中使用该结构,通过具体示例(如用户信息、列表和Map)说明其灵活性与便捷性。最后总结了Spring Boot中JSON数据返回的配置与实际项目中的应用技巧。
101 0
|
1月前
|
JSON Java fastjson
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——使用 fastJson 处理 null
本文介绍如何使用 fastJson 处理 null 值。与 Jackson 不同,fastJson 需要通过继承 `WebMvcConfigurationSupport` 类并覆盖 `configureMessageConverters` 方法来配置 null 值的处理方式。例如,可将 String 类型的 null 转为 &quot;&quot;,Number 类型的 null 转为 0,避免循环引用等。代码示例展示了具体实现步骤,包括引入相关依赖、设置序列化特性及解决中文乱码问题。
57 0
|
1月前
|
JSON Java fastjson
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——Spring Boot 默认对Json的处理
本文介绍了在Spring Boot中返回Json数据的方法及数据封装技巧。通过使用`@RestController`注解,可以轻松实现接口返回Json格式的数据,默认使用的Json解析框架是Jackson。文章详细讲解了如何处理不同数据类型(如类对象、List、Map)的Json转换,并提供了自定义配置以应对null值问题。此外,还对比了Jackson与阿里巴巴FastJson的特点,以及如何在项目中引入和配置FastJson,解决null值转换和中文乱码等问题。
65 0
|
4天前
|
JSON Java 数据库连接
怎样用 esProc 计算来自 Restful 的多层 json 数据
esProc 是一款强大的数据处理工具,可简化 Java 处理 Restful 接口返回的复杂多层 JSON 数据的难题。通过 esProc,不仅能轻松访问和解析 Restful 数据,还能高效完成复杂计算任务,并可无缝嵌入 Java 应用中作为计算引擎使用。例如,筛选特定分类订单或计算金额,esProc 的脚本简洁直观,远优于传统 SQL 或纯 Java 实现。此外,esProc 支持安全认证(如 Cookie 和 Token)及 JDBC 集成,为开发者提供灵活高效的解决方案。
|
7天前
|
JSON JavaScript 数据格式
何如定义 JSON Schema 并验证该 json 数据?
本文定义了一个包含 audio 和 tags 两个必需属性的 JSON Schema,用于规范数据结构。其中,audio 是非空字符串,表示音频组件;tags 是非空数组,表示标签组件。通过示例数据和验证工具(如 ajv, NJsonSchema),可确保 JSON 数据符合 Schema 要求,从而保障数据的一致性和正确性。
60 1
|
12天前
|
数据采集 存储 JSON
用Python爬虫抓取数据并保存为JSON的完整指南
用Python爬虫抓取数据并保存为JSON的完整指南
|
28天前
|
存储 JSON API
淘宝商品详情API接口概述与JSON数据示例
淘宝商品详情API是淘宝开放平台提供的核心接口之一,为开发者提供了获取商品深度信息的能力。以下是技术细节和示例:
|
Python
【Python初级】StringIO和BytesIO读写操作的小思考
from io import StringIO; f = StringIO(); f.write('Hello World'); s = f.readline(); print s; 上面这种方法“无论如何”都读不出f的内容,使用readlines和循环也不行。
1544 0

热门文章

最新文章