最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python處理JSON文件的完整流程(讀取、解析、修改和保存)

 更新時(shí)間:2025年11月20日 10:22:15   作者:mftang  
JSON是一種輕量級(jí)的數(shù)據(jù)交換格式,易于人閱讀和編寫,也易于機(jī)器解析和生成,以下是 JSON 文件的完整定義方法和規(guī)范,本文還介紹了使用Python處理JSON文件的完整流程,包括讀取、解析、修改和保存JSON數(shù)據(jù)的方法,需要的朋友可以參考下

概述

JSON(JavaScript Object Notation)是一種輕量級(jí)的數(shù)據(jù)交換格式,易于人閱讀和編寫,也易于機(jī)器解析和生成。以下是 JSON 文件的完整定義方法和規(guī)范。本文還介紹了使用Python處理JSON文件的完整流程,包括讀取、解析、修改和保存JSON數(shù)據(jù)的方法。

1 JSON文件

1.1 JSON文件定義

JSON(JavaScript Object Notation)是一種輕量級(jí)的數(shù)據(jù)交換格式,易于人閱讀和編寫,同時(shí)也易于機(jī)器解析和生成。它基于JavaScript編程語言的一個(gè)子集,但是獨(dú)立于語言,許多編程語言都支持JSON。

JSON文件通常用于存儲(chǔ)和傳輸結(jié)構(gòu)化的數(shù)據(jù)。一個(gè)JSON文件包含一個(gè)單獨(dú)的JSON數(shù)據(jù)結(jié)構(gòu),這個(gè)結(jié)構(gòu)可以是對(duì)象(在Python中對(duì)應(yīng)字典)或數(shù)組(在Python中對(duì)應(yīng)列表)。

{
    "字符串": "Hello, World!",
    "數(shù)字": 42,
    "浮點(diǎn)數(shù)": 3.14159,
    "布爾值_true": true,
    "布爾值_false": false,
    "空值": null,
    "數(shù)組": [1, 2, 3, 4, 5],
    "對(duì)象": {
        "鍵": "值"
    }
}

1.2 JSON文件的基本結(jié)構(gòu)

1) 對(duì)象(Object)

用花括號(hào) {} 包圍,表示一組無序的鍵值對(duì)。每個(gè)鍵值對(duì)中,鍵是一個(gè)字符串,值可以是字符串、數(shù)字、布爾值、數(shù)組、對(duì)象或null。鍵和值之間用冒號(hào) : 分隔,鍵值對(duì)之間用逗號(hào) , 分隔。

{
    "基礎(chǔ)類型示例": {
        "string": "這是一個(gè)字符串",
        "number": 123,
        "float": 45.67,
        "boolean_true": true,
        "boolean_false": false,
        "null_value": null
    },
    "數(shù)組示例": [
        "apple",
        "banana",
        "cherry"
    ],
    "嵌套對(duì)象示例": {
        "user": {
            "name": "張三",
            "age": 30,
            "email": "zhangsan@example.com"
        }
    }
}

2) 數(shù)組(Array)

用方括號(hào) [] 包圍,表示一組有序的值。值可以是字符串、數(shù)字、布爾值、數(shù)組、對(duì)象或null。值之間用逗號(hào) , 分隔。

["apple", "banana", "cherry"]

3) 值(Value)

可以是字符串、數(shù)字、布爾值、數(shù)組、對(duì)象或null。

JSON數(shù)據(jù)類型的詳細(xì)說明:

  • 字符串(String):必須用雙引號(hào) " 包圍。例如:"Hello"。
  • 數(shù)字(Number):可以是整數(shù)或浮點(diǎn)數(shù),不需要引號(hào)。例如:423.14。
  • 布爾值(Boolean)true 或 false,不需要引號(hào)。
  • 空值(Null)null,表示空值。
  • 對(duì)象(Object):如上所述。
  • 數(shù)組(Array):如上所述。

1.3 JSON文件的示例

一個(gè)典型的JSON文件可能如下所示(例如,一個(gè)表示用戶信息的JSON文件):

{
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "metadata": {
        "version": "1.0.0",
        "created": "2024-01-01T00:00:00Z",
        "description": "示例 JSON 文件定義",
        "author": "Developer"
    },
    "data": {
        "users": [
            {
                "id": 1,
                "username": "alice",
                "profile": {
                    "firstName": "Alice",
                    "lastName": "Johnson",
                    "age": 28,
                    "email": "alice@example.com",
                    "phone": "+1234567890",
                    "address": {
                        "street": "123 Main St",
                        "city": "New York",
                        "state": "NY",
                        "zipCode": "10001",
                        "country": "USA"
                    }
                },
                "preferences": {
                    "theme": "dark",
                    "language": "en-US",
                    "notifications": true,
                    "newsletter": false
                },
                "socialMedia": {
                    "twitter": "@alicej",
                    "github": "alicejohnson",
                    "linkedin": "alice-johnson"
                },
                "tags": ["developer", "python", "javascript"],
                "isActive": true,
                "lastLogin": "2024-01-15T10:30:00Z",
                "createdAt": "2023-06-01T08:00:00Z"
            },
            {
                "id": 2,
                "username": "bob",
                "profile": {
                    "firstName": "Bob",
                    "lastName": "Smith",
                    "age": 35,
                    "email": "bob@example.com",
                    "phone": "+0987654321",
                    "address": {
                        "street": "456 Oak Ave",
                        "city": "Los Angeles",
                        "state": "CA",
                        "zipCode": "90210",
                        "country": "USA"
                    }
                },
                "preferences": {
                    "theme": "light",
                    "language": "en-GB",
                    "notifications": false,
                    "newsletter": true
                },
                "socialMedia": {
                    "twitter": "@bobsmith",
                    "github": null,
                    "linkedin": "bob-smith"
                },
                "tags": ["designer", "ui/ux", "figma"],
                "isActive": true,
                "lastLogin": "2024-01-14T15:45:00Z",
                "createdAt": "2023-07-15T09:15:00Z"
            }
        ],
        "products": [
            {
                "id": "P001",
                "name": "筆記本電腦",
                "category": "electronics",
                "price": 999.99,
                "currency": "USD",
                "inStock": true,
                "stockQuantity": 50,
                "specifications": {
                    "brand": "TechBrand",
                    "model": "X1 Carbon",
                    "processor": "Intel i7",
                    "ram": "16GB",
                    "storage": "512GB SSD",
                    "display": "14英寸"
                },
                "features": ["輕薄", "長續(xù)航", "高性能"],
                "images": [
                    "https://example.com/images/product1-1.jpg",
                    "https://example.com/images/product1-2.jpg"
                ],
                "reviews": [
                    {
                        "userId": 1,
                        "rating": 5,
                        "comment": "非常棒的筆記本電腦!",
                        "date": "2024-01-10T14:20:00Z"
                    },
                    {
                        "userId": 2,
                        "rating": 4,
                        "comment": "性能不錯(cuò),但價(jià)格稍高",
                        "date": "2024-01-12T09:30:00Z"
                    }
                ],
                "tags": ["laptop", "electronics", "portable"],
                "warranty": {
                    "period": 24,
                    "unit": "months",
                    "type": "manufacturer"
                }
            }
        ],
        "settings": {
            "pagination": {
                "pageSize": 20,
                "maxPageSize": 100
            },
            "cache": {
                "enabled": true,
                "ttl": 3600
            },
            "api": {
                "rateLimit": 1000,
                "timeout": 30
            }
        }
    },
    "pagination": {
        "totalUsers": 2,
        "totalProducts": 1,
        "currentPage": 1,
        "totalPages": 1,
        "hasNext": false,
        "hasPrevious": false
    }
}

2 Python 解析JSON文件

2.1 解析Json方法

在Python中解析JSON文件通常使用內(nèi)置的json模塊。以下是一個(gè)簡單的步驟:

  1. 導(dǎo)入json模塊。
  2. 打開JSON文件。
  3. 使用json.load()函數(shù)加載文件內(nèi)容。

注意:在打開文件時(shí),我們使用with語句來自動(dòng)處理文件的關(guān)閉。如果JSON文件包含數(shù)組,同樣可以使用上述方法,返回的將是一個(gè)Python列表。另外,如果有一個(gè)JSON字符串,可以使用json.loads()函數(shù)來解析字符串。

2.2 解析JSON文件實(shí)例

下面是一個(gè)完整的Python程序,演示如何解析JSON文件,并提供多種操作JSON數(shù)據(jù)的方法。

該程序?qū)崿F(xiàn)如下功能:

  1. 讀取JSON文件:使用json.load()函數(shù)讀取JSON文件內(nèi)容
  2. 顯示JSON結(jié)構(gòu):遞歸顯示JSON數(shù)據(jù)的層次結(jié)構(gòu)
  3. 提取數(shù)據(jù):從JSON中提取特定鍵的值
  4. 修改數(shù)據(jù):向JSON數(shù)據(jù)中添加新內(nèi)容
  5. 保存JSON文件:使用json.dump()將數(shù)據(jù)保存為JSON文件
  6. 錯(cuò)誤處理:處理文件不存在、JSON格式錯(cuò)誤等異常情況

1) 源代碼文件如下:

import json
import os
from datetime import datetime

def read_json_file(filename):
    """讀取JSON文件并返回解析后的數(shù)據(jù)"""
    try:
        with open(filename, 'r', encoding='utf-8') as file:
            data = json.load(file)
            print(f"成功讀取JSON文件: {filename}")
            return data
    except FileNotFoundError:
        print(f"錯(cuò)誤: 文件 {filename} 不存在")
        return None
    except json.JSONDecodeError as e:
        print(f"錯(cuò)誤: JSON格式不正確 - {e}")
        return None
    except Exception as e:
        print(f"錯(cuò)誤: 讀取文件時(shí)發(fā)生錯(cuò)誤 - {e}")
        return None

def display_json_structure(data, indent=0):
    """遞歸顯示JSON數(shù)據(jù)的結(jié)構(gòu)"""
    if isinstance(data, dict):
        for key, value in data.items():
            print("  " * indent + f"├─ {key} ({type(value).__name__})")
            display_json_structure(value, indent + 1)
    elif isinstance(data, list):
        if data:
            print("  " * indent + f"├─ 列表 [{len(data)} 個(gè)元素]")
            # 只顯示第一個(gè)元素的結(jié)構(gòu)作為示例
            if len(data) > 0:
                display_json_structure(data[0], indent + 1)
        else:
            print("  " * indent + "├─ 空列表")

def extract_values(data, key_to_find):
    """遞歸查找JSON中特定鍵的所有值"""
    results = []
    
    if isinstance(data, dict):
        for key, value in data.items():
            if key == key_to_find:
                results.append(value)
            results.extend(extract_values(value, key_to_find))
    elif isinstance(data, list):
        for item in data:
            results.extend(extract_values(item, key_to_find))
    
    return results

def save_json_file(data, filename):
    """將數(shù)據(jù)保存為JSON文件"""
    try:
        with open(filename, 'w', encoding='utf-8') as file:
            json.dump(data, file, ensure_ascii=False, indent=2)
        print(f"成功保存JSON文件: {filename}")
    except Exception as e:
        print(f"錯(cuò)誤: 保存文件時(shí)發(fā)生錯(cuò)誤 - {e}")

def main():
    # 示例JSON數(shù)據(jù)
    sample_data = {
        "users": [
            {
                "id": 1,
                "name": "張三",
                "email": "zhangsan@example.com",
                "age": 28,
                "is_active": True,
                "registration_date": "2023-01-15",
                "hobbies": ["閱讀", "游泳", "編程"]
            },
            {
                "id": 2,
                "name": "李四",
                "email": "lisi@example.com",
                "age": 32,
                "is_active": False,
                "registration_date": "2022-11-03",
                "hobbies": ["攝影", "旅行"]
            },
            {
                "id": 3,
                "name": "王五",
                "email": "wangwu@example.com",
                "age": 25,
                "is_active": True,
                "registration_date": "2023-03-22",
                "hobbies": ["音樂", "烹飪", "健身", "繪畫"]
            }
        ],
        "metadata": {
            "total_users": 3,
            "created": "2023-04-01",
            "version": "1.0"
        }
    }
    
    # 1. 創(chuàng)建示例JSON文件
    filename = "sample_data.json"
    save_json_file(sample_data, filename)
    
    # 2. 讀取JSON文件
    data = read_json_file(filename)
    if data is None:
        return
    
    print("\n" + "="*50)
    print("JSON文件內(nèi)容:")
    print("="*50)
    print(json.dumps(data, ensure_ascii=False, indent=2))
    
    # 3. 顯示JSON結(jié)構(gòu)
    print("\n" + "="*50)
    print("JSON數(shù)據(jù)結(jié)構(gòu):")
    print("="*50)
    display_json_structure(data)
    
    # 4. 提取特定信息
    print("\n" + "="*50)
    print("提取特定信息:")
    print("="*50)
    
    # 提取所有用戶名
    names = extract_values(data, "name")
    print(f"所有用戶名: {names}")
    
    # 提取所有郵箱
    emails = extract_values(data, "email")
    print(f"所有郵箱: {emails}")
    
    # 提取活躍用戶
    active_users = [user for user in data["users"] if user["is_active"]]
    print(f"活躍用戶數(shù)量: {len(active_users)}")
    for user in active_users:
        print(f"  - {user['name']} ({user['email']})")
    
    # 5. 修改數(shù)據(jù)
    print("\n" + "="*50)
    print("修改數(shù)據(jù):")
    print("="*50)
    
    # 添加新用戶
    new_user = {
        "id": 4,
        "name": "趙六",
        "email": "zhaoliu@example.com",
        "age": 29,
        "is_active": True,
        "registration_date": datetime.now().strftime("%Y-%m-%d"),
        "hobbies": ["籃球", "電影"]
    }
    
    data["users"].append(new_user)
    data["metadata"]["total_users"] = len(data["users"])
    data["metadata"]["updated"] = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    
    print("添加新用戶后:")
    print(f"用戶總數(shù): {data['metadata']['total_users']}")
    
    # 6. 保存修改后的數(shù)據(jù)
    updated_filename = "updated_data.json"
    save_json_file(data, updated_filename)
    
    # 7. 驗(yàn)證保存的文件
    print("\n" + "="*50)
    print("驗(yàn)證保存的文件:")
    print("="*50)
    
    updated_data = read_json_file(updated_filename)
    if updated_data:
        print(f"更新后的用戶總數(shù): {updated_data['metadata']['total_users']}")
    
    # 8. 清理: 刪除創(chuàng)建的文件
    print("\n" + "="*50)
    print("清理:")
    print("="*50)
    
    for file_to_remove in [filename, updated_filename]:
        if os.path.exists(file_to_remove):
            os.remove(file_to_remove)
            print(f"已刪除文件: {file_to_remove}")

if __name__ == "__main__":
    main()

2) 運(yùn)行結(jié)果如下:

成功保存JSON文件: sample_data.json
成功讀取JSON文件: sample_data.json

==================================================
JSON文件內(nèi)容:
==================================================
{
  "users": [
    {
      "id": 1,
      "name": "張三",
      "email": "zhangsan@example.com",
      "age": 28,
      "is_active": true,
      "registration_date": "2023-01-15",
      "hobbies": [
        "閱讀",
        "游泳",
        "編程"
      ]
    },
    {
      "id": 2,
      "name": "李四",
      "email": "lisi@example.com",
      "age": 32,
      "is_active": false,
      "registration_date": "2022-11-03",
      "hobbies": [
        "攝影",
        "旅行"
      ]
    },
    {
      "id": 3,
      "name": "王五",
      "email": "wangwu@example.com",
      "age": 25,
      "is_active": true,
      "registration_date": "2023-03-22",
      "hobbies": [
        "音樂",
        "烹飪",
        "健身",
        "繪畫"
      ]
    }
  ],
  "metadata": {
    "total_users": 3,
    "created": "2023-04-01",
    "version": "1.0"
  }
}

==================================================
JSON數(shù)據(jù)結(jié)構(gòu):
==================================================
├─ users (list)
  ├─ 列表 [3 個(gè)元素]
    ├─ id (int)
    ├─ name (str)
    ├─ email (str)
    ├─ age (int)
    ├─ is_active (bool)
    ├─ registration_date (str)
    ├─ hobbies (list)
      ├─ 列表 [3 個(gè)元素]
├─ metadata (dict)
  ├─ total_users (int)
  ├─ created (str)
  ├─ version (str)

==================================================
提取特定信息:
==================================================
所有用戶名: ['張三', '李四', '王五']
所有郵箱: ['zhangsan@example.com', 'lisi@example.com', 'wangwu@example.com']
活躍用戶數(shù)量: 2
  - 張三 (zhangsan@example.com)
  - 王五 (wangwu@example.com)

==================================================
修改數(shù)據(jù):
==================================================
添加新用戶后:
用戶總數(shù): 4
成功保存JSON文件: updated_data.json

==================================================
驗(yàn)證保存的文件:
==================================================
成功讀取JSON文件: updated_data.json
更新后的用戶總數(shù): 4

==================================================
清理:
==================================================
已刪除文件: sample_data.json
已刪除文件: updated_data.json

Process finished with exit code 0

以上就是Python處理JSON文件的完整流程(讀取、解析、修改和保存)的詳細(xì)內(nèi)容,更多關(guān)于Python處理JSON文件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Django forms組件的使用教程

    Django forms組件的使用教程

    服務(wù)端假設(shè)所有用戶提交的數(shù)據(jù)都是不可信任的,所以Django框架內(nèi)置了form組件來驗(yàn)證用戶提交的信息,這篇文章主要介紹了Django forms組件的使用教程,感興趣的小伙伴們可以參考一下
    2018-10-10
  • Python常用隨機(jī)數(shù)與隨機(jī)字符串方法實(shí)例

    Python常用隨機(jī)數(shù)與隨機(jī)字符串方法實(shí)例

    這篇文章主要介紹了Python常用隨機(jī)數(shù)與隨機(jī)字符串方法實(shí)例,本文講解了隨機(jī)整數(shù)、隨機(jī)選取0到100間的偶數(shù)、隨機(jī)浮點(diǎn)數(shù)、隨機(jī)字符串等常用隨機(jī)方法,需要的朋友可以參考下
    2015-04-04
  • Python光學(xué)仿真之對(duì)光的干涉理解學(xué)習(xí)

    Python光學(xué)仿真之對(duì)光的干涉理解學(xué)習(xí)

    這篇文章主要為大家介紹了Python光學(xué)仿真之對(duì)光的干涉理解學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2021-10-10
  • Python進(jìn)行ffmpeg推流和拉流rtsp、rtmp實(shí)例詳解

    Python進(jìn)行ffmpeg推流和拉流rtsp、rtmp實(shí)例詳解

    Python推流本質(zhì)是調(diào)用FFmpeg的推流進(jìn)程,下面這篇文章主要給大家介紹了關(guān)于Python進(jìn)行ffmpeg推流和拉流rtsp、rtmp的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • Python之Await 協(xié)議的實(shí)現(xiàn)

    Python之Await 協(xié)議的實(shí)現(xiàn)

    本文主要介紹了Python之Await 協(xié)議的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-05-05
  • pyqt4教程之widget使用示例分享

    pyqt4教程之widget使用示例分享

    這篇文章主要介紹了pyqt4的widget使用示例,需要的朋友可以參考下
    2014-03-03
  • 教你兩步解決conda安裝pytorch時(shí)下載速度慢or超時(shí)的問題

    教你兩步解決conda安裝pytorch時(shí)下載速度慢or超時(shí)的問題

    這篇文章主要介紹了教你兩步解決conda安裝pytorch時(shí)下載速度慢or超時(shí)的問題,使用清華鏡像源可以大大減少安裝的時(shí)間,需要的朋友可以參考下
    2023-03-03
  • 淺談pandas用groupby后對(duì)層級(jí)索引levels的處理方法

    淺談pandas用groupby后對(duì)層級(jí)索引levels的處理方法

    今天小編就為大家分享一篇淺談pandas用groupby后對(duì)層級(jí)索引levels的處理方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • python抖音表白程序源代碼

    python抖音表白程序源代碼

    這篇文章主要為大家詳細(xì)介紹了python抖音表白程序源代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • Python一行代碼實(shí)現(xiàn)ChatGPT接入微信機(jī)器人

    Python一行代碼實(shí)現(xiàn)ChatGPT接入微信機(jī)器人

    這篇文章主要為大家介紹了Python一行代碼實(shí)現(xiàn)ChatGPT接入微信機(jī)器人示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03

最新評(píng)論

凤庆县| 顺平县| 德惠市| 宿州市| 来安县| 凤城市| 定安县| 东乡县| 黄龙县| 鸡西市| 天门市| 丹阳市| 靖州| 清丰县| 永仁县| 尖扎县| 西畴县| 六枝特区| 麻阳| 沁水县| 车致| 泸水县| 理塘县| 揭东县| 五常市| 长武县| 咸丰县| 马边| 达州市| 祁门县| 罗江县| 徐水县| 简阳市| 东港市| 老河口市| 鱼台县| 西青区| 顺昌县| 乐至县| 通海县| 辽中县|