百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

Python如何读写json数据(python读取json数据的key值)

liuian 2025-04-11 00:58 36 浏览

先介绍一下什么是json,还是先看一下百度百科怎么说。

JSON(JavaScript Object Notation,JavaScript对象表示法)是基于ECMAScript的一个子集设计的,是一种开放标准的文件格式和数据交换格式,它易于人阅读和编写,同时也易于机器解析和生成。JSON独立于语言设计,很多编程语言都支持JSON格式的数据交换。

按照上面百科词条的说法,json和用什么语言没有什么关系,他就是一种数据交换格式。

JSON 的数据结构

JSON 由两种数据结构组成:对象数组

对象(object)是由键值对组成的无序集合,键是字符串,值可以是任何类型,包括对象和数组。对象由一对花括号{ }包围,键和值之间用冒号:分隔。键值对之间用逗号,分隔。

数组(array)是值(value)的有序集合,每个值可以是任何类型,包括对象和数组。数组由一对方括号[ ]包裹,值之间用逗号,分隔。

值(value)可以是花括号{ }括起来的字符串(String)、数值(Number)、布尔值(true/false)、 null、对象(Object)或者数组(Array),这些结构可以嵌套。

# 对象结构
{
    "name": "John",
    "age": 30,
    "isStudent": false
}
# 数组结构
[ "apple",  "banana",  "orange"]

看似和python中的字典差不多,但是你要知道他们是不一样的,数据类型都不同。

JSON 的优点和缺点

优点

  1. 与 JavaScript 完美兼容:JSON 格式源自 JavaScript,因此它与 JavaScript 非常兼容,并且易于在 JavaScript 应用程序中使用。
  2. 轻量级:JSON 格式非常轻量级,因此它非常适合在网络中传输大量数据。相比于 XML,它的数据量更小,传输速度更快。
  3. 跨平台和语言无关性:JSON 格式是一种跨语言的格式,它可以被许多不同语言的程序支持,易于解析和生成,几乎所有编程语言都支持 JSON。
  4. 易于阅读和操作:JSON 格式非常易于阅读和编写,因为它具有简单的语法和结构,格式清晰,具有良好的可读性。

缺点

  1. 不支持注释: JSON 格式不支持注释,这可能使得编写和维护复杂数据时变得有些困难。
  2. 不适合存储大量数据 JSON 格式无法直接表示二进制数据,这意味着它无法用于存储和传输图像、视频等二进制数据。并且,相比较于二进制,JSON的文本格式,在储存大量数据的时候会在占用非常多的储存空间。
  3. 不支持命名空间: JSON 不支持命名空间,这可能会导致不同的应用程序之间发生命名冲突。
  4. 不支持DTD: JSON 不支持 DTD,这使得在验证 JSON 数据格式时不太方便。

JSON 和 XML 的区别

其实现在数据交换,大家都是用JSON了,逐渐成为主流,xml用的越来越少了,不过还是有它自己独特的特性,在程序中没有好与坏,只有适不适合。

JSON 和 XML都是常用的数据交换格式。它们之间有什么区别呢?

  1. 简洁性与可读性:
    JSON 比 XML 更加简洁和易读。相比于 XML 的繁琐闭合标签,JSON 采用更为紧凑的表示形式,使得数据结构更清晰明了。
  2. 解析速度与带宽占用:
    JSON 的解析速度通常比 XML 更快,因为它的结构简单,不需要解析复杂的标签。总体内容变少了,导致JSON 数据通常占用的带宽更少,有助于提高传输效率。
  3. 数据复杂性:
    XML 比 JSON 更适合描述复杂的数据类型和嵌套结构。XML 支持命名空间和多种数据格式,这使得它在处理复杂数据和配置文件时具有优势。
  4. 注释支持:
    JSON 不支持注释,这意味着在数据中不能嵌入注释说明。而 XML 则支持注释,可以在数据文档中添加解释说明,便于维护和理解。

Python中如何读写JSON数据

只要你充分认识了JSON格式,其实也可以使用字符串拼接的形式构建一些简单的JSON字符串,但是局限性特别强,并且容易出错。

Python标准库中的json模块,提供了很多读写JSON数据的方法,下面我们来认识一下。

1、JSON模块的dump() 或 dumps() 函数将 Python 对象转换为 JSON 对象

dumps是将字典类型的数据转换为字符串,参数如下:

  • dictionary – 需要转换为 JSON 对象的字典。
  • indent – 定义缩进。

dump是将json数据写进文件,参数如下:

  • dictionary – 需要转换为 JSON 对象的字典。
  • file pointer – 在写入或追加模式下打开的文件。

当然你也可以通过文件的 write 方法写入json字符串

import json
data = {'name': 'zhangsan'}
# 返回字符串
json_str = json.dumps(data)
print(json_str)
# 写入文件
with open('data.json', 'w') as f:
    json.dump(data, f)

2、JSON模块的load() 或 loads() 函数将 JSON 字符串转换为 Python 对象

loads() 是将 JSON 对象的字符串转为Python字典,load() 函数可将 JSON 内容从 JSON 文件加载到字典中。

import json
dictionary = '{"name": "zhangsan"}'
json_obj = json.loads(dictionary)
print(json_obj) #{'name': 'zhangsan'}

with open('data.json', 'r') as f:
    json_obj = json.load(f)
print(json_obj) #{'name': 'zhangsan'}
print(type(json_obj)) #

Python中JSON的一些高级处理

上面介绍了最常用的功能,就那四个方法,下面认识一下json模块都有哪些高级功能。

自定义编码和解码

在一些复杂的场景中,你可能需要对Python对象进行自定义的序列化和反序列化。通过继承json.JSONEncoder和json.JSONDecoder类并重写相应的方法,你可以实现自定义的JSON编码和解码逻辑。

import json
class CustomEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, complex):
            return [obj.real, obj.imag]
        return json.JSONEncoder.default(self, obj)
# 使用自定义编码器
encoded_json = json.dumps(2 + 3j, cls=CustomEncoder)
print(encoded_json)  # 输出: [2.0, 3.0]

class CustomDecoder(json.JSONDecoder):
    def __init__(self):
        json.JSONDecoder.__init__(self, object_hook=self.object_hook)
    def object_hook(self, dct):
        if '__complex__' in dct:
            return complex(dct['__complex__'][0], dct['__complex__'][1])
        return dct
# 使用自定义解码器
decoded_obj = json.loads('{"__complex__": [2.0, 3.0]}', cls=CustomDecoder)
print(decoded_obj)  # 输出: (2+3j)

使用indent参数美化输出

在将Python对象转换为JSON字符串时,可以使用indent参数来指定缩进的空格数,从而使输出的JSON字符串更易读。这对于调试和查看复杂的JSON数据结构非常有帮助。

data = {'name': 'zhangsan'}
json_str = json.dumps(data, indent=4, ensure_ascii=False)
print(json_str)
#{
#    "name": "zhangsan"
#}

格式校验与异常处理

在我们使用json模块的过程中有时候会遇到一些异常情况,比如:数据格式不正确、编码问题、文件路径错误、数据类型不支持等。尤其是数据格式问题,这是经常遇到的,在解析日志文件时遇到一些数据存在多余的逗号或者括号位置出错等等问题。这需要我们特别注意,不要传输不合法的JSON数据。

当然,即使遇到了上述问题,通过恰当的异常处理机制,能够确保程序的健壮性。在编写处理JSON数据的代码时,应该始终记得对相关操作加上try-except块,以便捕获并处理异常。

  • 对于json.loads()和json.load()使用json.JSONDecodeError来捕获格式相关的错误。
  • 对于json.dumps()和json.dump()使用TypeError来捕获不支持类型的错误。
  • 对于编码错误,捕获UnicodeDecodeError或UnicodeEncodeError。
  • 对于文件访问错误,捕获FileNotFoundError。
json_str = "不是有效的JSON字符串"
try:
    # 尝试解析JSON
    data = json.loads(json_str)
except json.JSONDecodeError:
    print("输入的字符串不是有效的JSON格式")
except TypeError:
    print("解析函数需要一个字符串类型的参数")
except ValueError:
    print("输入字符串中包含无法解析的值")

相关推荐

iOS9不越狱也能用:苹果Xcode 7编译安装第三方应用教程

在苹果iOS9正式版系统中,即使你不越狱现在也可以安装一些AppStore中根本不存在的应用程序,听上去感觉有些不可思议是吧,一起来看看这到底是怎么做到的。需要准备的东西:你需要准备一台Mac、X...

Python+Appium控制 iOS 真机,滑动、输入、点击全搞定!

移动端自动化测试中,Appium+iOS测试算是门槛稍高但非常关键的一环。很多测试同学面对XCUITest+真机操作时,总觉得“设备连不上”、“控件找不到”、“滑动失败”。先看效果今天我用...

从零到一:用Cursor和Xcode打造你的iOS App!

想要开发自己的iOSApp吗?跟随我们的教程,从前期准备到App上架,一步步教你如何实现!"步骤1:开发App的前期准备"设备和软件:你需要一台Mac电脑、免费的Xcode和Curs...

苹果向开发者推送visionOS 2.5的第四个测试版

近日,苹果面向开发者正式推送了visionOS2.5的第四个Beta开发者预览版,版本号为22O5467a。开发者只需打开设备端的设置应用,在相关选项中找到“开发者测试版”开关,即可开启下...

苹果向开发者推送visionOS 2.5的第一个测试版

苹果公司近日向其注册开发者推送了visionOS2.5更新的第一个Beta测试版,版本号为22O5442g。为了安装这一测试版,开发者们只需通过VisionPro设备上的“设置”应用...

iPhone 16 Pro Max Xcode首选,iPad Pro 2024开发利器

最佳开发者适配机型榜1.iPhone16ProMax(A18Pro模拟器优化)2.iPadPro2024(M4芯片多任务)3.iPhone15Pro(Xcode调试工具)4.iP...

react native中自定义 URL Scheme并跳转到指定页面

在ReactNative中实现类似Android的自定义URLScheme(myapp://open)并跳转到指定页面,可以通过以下步骤完成。ReactNative提供了对深度链接(...

传闻暗示 iPhone 将推出桌面模式(苹果推出页面怎样才能保持推出前的状态)

最近,除了有关iOS视觉效果大幅重新设计和更像Mac的iPadOS体验的传闻外,还有一个有趣的传闻正在流传:iPhone可能会获得某种桌面模式。MajinBu上周写道,一些匿名消息人士称,...

苹果visionOS 1.3首个测试版开启推送 建议谨慎下载

【CNMO科技消息】据外媒报道,开发者现已能够下载体验visionOS1.3首个测试版,只需将其安装在VisionPro上即可。这一版本的发布紧随5月7日释出的第五个测试版之后,而在此之前,4月3...

XcodeBuildMCP 让 AI 代理能够通过标准化接口与 Xcode 项目进行交互

项目介绍XcodeBuildMCP是一个ModelContextProtocol(MCP)服务器,提供与Xcode相关的工具,以便与AI助手和其他MCP客户端集成。它旨在通过标准化接口优化开发...

每日学习“Xcode”是什么呢?(xcode是开发什么的)

Xcode是苹果公司为macOS系统量身打造的集成开发环境(IDE),专为开发苹果生态系统内的各类应用程序,其中也包括游戏。以下从特点、安装使用、在游戏开发中的应用方面详细介绍。特点全平台支持:...

升级wpsjs工具包,创建和发布wps加载项

前一段时间wpsjs工具包不能创建、调试和发布wps加载项,目前已修复,请更新到最新版。wpsjs工具包升级到最新版可以创建和发布wps加载项。执行以下命令:npmupdate-gwpsjs...

如何在 TypeScript 中使用Enum(枚举)

在TypeScript中,枚举或枚举类型是具有一组常量值的常量长度的数据结构。这些常量值中的每一个都称为枚举的成员。在设置只能是一定数量的可能值的属性或值时,枚举很有用。一个常见的例子是一副扑克...

Vue独立组件——11个最佳Vue.js日期选择器组件

介绍本文主要介绍几个Vue的时间日期选择器组件,目的在于让开发者们多一些选择,不管是从功能还是从样式,都可以选择一个适合的组件,这些组件没有绝对的好与不好,就看个人如何选择了,以下分别介绍十一个日期选...

ABP Framework 手动升级指南:从6.0.1升级到7.0.0

ABP7.0.0正式版已经发布,ABP-Framework-All-In-One项目同步升级。LeptonXLiteTheme目前还没有包含在源码解决方案中,还是以Nuget包提供,目...