Python .get 嵌套 JSON 值

对于长期使用python写代码的我来说,经常在Python代码中,使用.get方法来访问嵌套在JSON结构中的值。我们知道JSON(JavaScript Object Notation)是一种常见的数据交换格式,它可以包含嵌套的键值对。但是在我们使用总该如何获取嵌套对象中的值呢?

1、问题背景

在 Python 中,可以使用 .get() 方法从 JSON 对象中获取值。当 JSON 对象中嵌套了其他 JSON 对象时,如何获取嵌套对象中的值呢?

例如,以下 JSON 对象中包含了一个名为 "product" 的嵌套对象,该对象又包含了几个子对象。

bash 复制代码
{
            "title": "Test prod",
            "leafPage": true,
            "type": "product",
            "product": {
                "title": "test product",
                "offerPrice": "$19.95",
                "offerPriceDetails": {
                    "amount": 19.95,
                    "text": "$19.95",
                    "symbol": "$"
                },
                "media": [
                    {
                        "link": "http://www.test.com/cool.jpg",
                        "primary": true,
                        "type": "image",
                        "xpath": "/html[1]/body[1]/div[1]/div[3]/div[2]/div[1]/div[1]/div[1]/div[1]/a[1]/img[1]"
                    }
                ],
                "availability": true
            },
            "human_language": "en",
            "url": "http://www.test.com"
        }

如果要获取 "product" 对象中的 "offerPrice" 值,可以使用以下代码:

csharp 复制代码
entry.get("product").get("offerPrice")

这样就可以获取到 "offerPrice" 的值 "$19.95"。

2、解决方案

但是,如果 JSON 对象中的嵌套对象不是直接使用键值对表示,而是使用数组表示,则获取嵌套对象中的值就会变得更加复杂。

例如,以下 JSON 对象中包含了一个名为 "media" 的嵌套数组,该数组中包含了多个子对象。

bash 复制代码
{
    "title": "Test prod",
    "leafPage": true,
    "type": "product",
    "product": {
        "title": "test product",
        "offerPrice": "$19.95",
        "offerPriceDetails": {
            "amount": 19.95,
            "text": "$19.95",
            "symbol": "$"
        },
        "media": [
            {
                "link": "http://www.test.com/cool.jpg",
                "primary": true,
                "type": "image",
                "xpath": "/html[1]/body[1]/div[1]/div[3]/div[2]/div[1]/div[1]/div[1]/div[1]/a[1]/img[1]"
            },
            {
                "link": "http://www.test.com/cool2.jpg",
                "primary": false,
                "type": "image",
                "xpath": "/html[1]/body[1]/div[1]/div[3]/div[2]/div[1]/div[1]/div[1]/div[1]/a[2]/img[1]"
            }
        ],
        "availability": true
    },
    "human_language": "en",
    "url": "http://www.test.com"
}

如果要获取 "media" 数组中的第一个子对象中的 "link" 值,可以使用以下代码:

csharp 复制代码
entry.get("product", {}).get("media", [])[0].get("link")

这样就可以获取到第一个子对象的 "link" 值 "www.test.com/cool.jpg"。

代码示例

kotlin 复制代码
import json
​
# 读取 JSON 文件
with open('data.json', 'r') as f:
    data = json.load(f)
​
# 获取 "product" 对象中的 "offerPrice" 值
offer_price = data.get("product", {}).get("offerPrice")
​
# 获取 "media" 数组中的第一个子对象的 "link" 值
media_link = data.get("product", {}).get("media", [])[0].get("link")
​
# 打印获取到的值
print("Offer price:", offer_price)
print("Media link:", media_link)

在这个例子中,.get方法用于安全地获取字典中的值,即使某个键不存在也不会导致程序崩溃。如果嵌套结构中有可能缺少某些键,可以使用.get方法来避免KeyError

请注意,第二个参数是.get方法的默认值,如果指定键不存在,则返回这个默认值。在这个例子中,我们使用{}作为默认值,以确保即使嵌套的"address"键不存在,我们仍然可以安全地调用.get("address", {}).get("city")而不会导致错误。

总的来说只要注意默认值以及语法使用是一点问题没有。如果大家有啥问题可以留言讨论。

相关推荐
causaliy3 小时前
实践六:防盗链知识点——视频
爬虫·音视频
xinxinhenmeihao9 小时前
爬虫导致IP被封号了如何解封?
爬虫·网络协议·tcp/ip
加油20191 天前
音视频处理(三):hls协议和m3u8详解和视频下载爬虫实战
爬虫·音视频·hls·m3u8·mpeg-2·mpeg2-ts·电视迷
闲人编程1 天前
从零开发一个简单的Web爬虫(使用Requests和BeautifulSoup)
前端·爬虫·beautifulsoup·bs4·web·request·codecapsule
B站计算机毕业设计之家1 天前
大数据python招聘数据分析预测系统 招聘数据平台 +爬虫+可视化 +django框架+vue框架 大数据技术✅
大数据·爬虫·python·机器学习·数据挖掘·数据分析
疏狂难除1 天前
spiderdemo第22题与webassembly的跨域
开发语言·javascript·爬虫·rust·wasm·mitmproxy
小白学大数据1 天前
增量爬取策略:如何持续监控贝壳网最新成交数据
爬虫·python·性能优化
苏打水com2 天前
Python 爬虫 3 大核心库深度解析:从原理到实战,覆盖 90% 爬取场景
爬虫
深蓝电商API2 天前
数据清洗标准化:构建可复用的爬虫数据清洗管道(Pipeline)
爬虫·数据清洗
深蓝电商API2 天前
“监狱”风云:如何设计爬虫的自动降级与熔断机制?
爬虫