使用 Python 处理 Json 数据
一、引言:什么是 JSON
JSON (Java Script Object Notation) 是一种很常用的数据格式,它常常用在 web 应用程序中。它可以表示结构化的数据。
下面是常见的 JSON 文件结构
它看起来与 Python 的 字典非常类似,也是由 key - value 结对组成,其中key是字符串形式,value是字符串、数字、布尔值、数组、对象或null。key/value间均使用逗号进行区分。
在 Python 中,JSON 作为字符串存在
JSON 与 Python 的数据结构和对应关系如下:
JSON | PYTHON |
---|---|
object | dict |
array | list, tuple |
string | str, unicode |
number | int, long, float |
true / false | True / False |
null | None |
要使用 JSON ,字符串或者包含 JSON 对象的文件,都可以使用 Python 的内置包 json
模块。
二、示例:在 Python 中解析 JSON
JSON 模组的常用方法
load / loads: 把 JSON 转换为 Python
- loads()
结果
将 JSON 转换为 Python 后,其结果的类型为字典
- load()
load() 是从json格式的文件中读取数据并转换为python的类型。适用于文件读取,所以我们按 loads() 的例子来操作是会出错的,可以使用 StringIO 转换一下。load()
的结果也是返回字典
dump / dumps: 把 Python 转换为 JSON
- dumps()
转换后的结果返回字符串
- dump()
有了 load()
的经验,你应该知道,不带 s 的 dump 方法是用来将python数据类型转换并保存到json格式的文件内的。
结果
总结
- dumps / dump: 将 Python 转换 JSON,返回的 type 为 str
- loads / load: 将 JSON 转换为 Python,返回的 type 为 Dict
- 如果要根据字符串转化方法中使用带有
s
的,要从文件进行转化就不加s
优雅的使用 json 模块
格式化 JSON 结果
不难发现,dumps 获得的 str 结果并不是很好看,如果数据量大,或者数据结构复杂,没有缩进和换行将使得 JSON 数据变得不容易阅读。
所以 dumps() 方法提供了一些令结果更易读的参数,这些参数在实际工作中也常常用到。
indent
参数:定义缩进数
转换的结果将按照 indent 缩进 4 格
separators
参数:更改默认分隔符
我们先来看看官方对其的定义:
If specified,
separators
should be an(item_separator, key_separator)
tuple. The default is(', ', ': ')
if indent isNone
and(',', ': ')
otherwise. To get the most compact JSON representation, you should specify(',', ':')
to eliminate whitespace.
- 类型应该传入元组
- 其默认值是
(',', ': ')
元组的第一个分隔符为 key-value 之间的分隔,默认是逗号;第二个分隔符为 key 与 value 之间的分隔,默认是冒号。
我们可以更改分隔符的样式:
结果
sort_keys
参数: 对结果排序,布尔值
结果
json 模块不支持转换 bytes 类型
需要注意的是对于 bytes,json 模块并不能顺利转换,要先将bytes转换为str格式。
直接转换 bytes 的结果是 TypeError,会告知你 bytes 不可JSON序列化, 只有转换为 str 类型后才可以序列化。
json 文件读写
结果
当然,我还是推荐使用 with open 的方式来写入数据
利用 pandas 读取 JSON
如果你想利用 DataFrame 的特性来处理数据,你还可以使用 Pandas 库来读取数据,它读取我们之前生成的 temp.json 的结果如下:
毫无疑问,我们可以用上强大的 pandas 的特性来处理 json 数据了。
但是,实际工作中,json 文件的内容可不像我们 temp.json 文件一样简单到朴实无华,我们需要知道怎么处理嵌套的 JSON 数据
有如下的 JSON 数据,保存在 json_test.json 文件中,members 字段中保存有 object 类型的数据,这些嵌套的数据在读取到 DataFrame 后会被转换为字典。
现在,我们按照以前的方法读取它
读取的结果如下
其中的 members 字段是保存了一整个字典的,那么应该如何把他拆分开呢?其实,这一步已经和 json 无关了,是依靠 pandas 来处理这些嵌套的数据了。
我们可以在 members 列上,使用 apply
方法
返回了 DataFrame 结果
但是,使用 apply
方法后生成了一个新 DataFrame,那我们还得想个办法给拼回去原来的 DataFrame。
其实,pandas 库中还有一个函数 json_normalize()
它会将 members 拆分并拼接到 DataFrame 结果中
record_path
: 需要拆分的列的名字meta
: 其他要加入到结果的列名的list,其顺序就是输出的顺序meta_prefix
: 这个参数可以给 meta 的字段名前加个前缀
__EOF__

本文链接:https://www.cnblogs.com/namelessguest/p/16748045.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!
2020-10-01 cookie和session的区别