Python遍历嵌套JSON

引言

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于前后端数据传输。在Python开发中,我们经常需要处理JSON数据,其中一个常见的需求是遍历嵌套的JSON结构。本文将介绍如何使用Python遍历嵌套JSON,并提供代码示例帮助读者更好地理解。

什么是JSON

JSON是一种基于文本的数据格式,用于表示结构化的数据。它由键值对组成,可以使用字符串、数字、布尔值、数组、对象等数据类型。JSON的结构可以是嵌套的,也就是说JSON的值可以是其他JSON对象。

下面是一个简单的JSON示例:

{
  "name": "John Doe",
  "age": 30,
  "isStudent": false,
  "hobbies": ["reading", "coding", "traveling"],
  "address": {
    "street": "123 Main St",
    "city": "New York",
    "state": "NY"
  }
}

Python解析JSON

Python提供了json模块用于解析和生成JSON数据。我们可以使用json.loads()函数将JSON字符串解析成Python对象,或者使用json.dumps()函数将Python对象转换成JSON字符串。

下面是一个示例,演示如何将JSON字符串解析成Python对象并访问其中的值:

import json

json_str = '''
{
  "name": "John Doe",
  "age": 30,
  "isStudent": false,
  "hobbies": ["reading", "coding", "traveling"],
  "address": {
    "street": "123 Main St",
    "city": "New York",
    "state": "NY"
  }
}
'''

data = json.loads(json_str)

print(data["name"])  # 输出: John Doe
print(data["age"])  # 输出: 30
print(data["hobbies"][0])  # 输出: reading
print(data["address"]["city"])  # 输出: New York

遍历嵌套JSON

当我们有一个嵌套的JSON结构时,我们可能需要遍历其中的所有值。Python提供了多种方法来实现这个目标,包括递归遍历和迭代遍历。

递归遍历JSON

递归是一种在算法中经常使用的技术,它可以用于解决嵌套结构的问题。在递归遍历JSON时,我们可以编写一个递归函数来处理每一层的JSON对象。

下面是一个示例,演示如何使用递归遍历嵌套JSON,并打印出所有的值:

import json

def traverse_json(obj):
    if isinstance(obj, dict):
        for key, value in obj.items():
            traverse_json(value)
    elif isinstance(obj, list):
        for item in obj:
            traverse_json(item)
    else:
        print(obj)

json_str = '''
{
  "name": "John Doe",
  "age": 30,
  "isStudent": false,
  "hobbies": ["reading", "coding", "traveling"],
  "address": {
    "street": "123 Main St",
    "city": "New York",
    "state": "NY"
  }
}
'''

data = json.loads(json_str)
traverse_json(data)

运行以上代码将输出:

John Doe
30
False
reading
coding
traveling
123 Main St
New York
NY

迭代遍历JSON

除了递归遍历,我们还可以使用迭代的方式遍历嵌套的JSON结构。迭代遍历通常使用栈(stack)数据结构来实现。

下面是一个示例,演示如何使用迭代遍历JSON,并打印出所有的值:

import json

def traverse_json(obj):
    stack = [obj]
    
    while stack:
        current = stack.pop()
        
        if isinstance(current, dict):
            for value in current.values():
                stack.append(value)
        elif isinstance(current, list):
            stack.extend(current)
        else:
            print(current)

json_str = '''
{
  "name": "John Doe",
  "age": 30,
  "isStudent": false,
  "hobbies": ["reading", "coding", "traveling"],
  "address": {
    "street": "123 Main St",
    "city": "New York",