技術(shù)頻道導(dǎo)航
HTML/CSS
.NET技術(shù)
IIS技術(shù)
PHP技術(shù)
Js/JQuery
Photoshop
Fireworks
服務(wù)器技術(shù)
操作系統(tǒng)
網(wǎng)站運(yùn)營

贊助商

分類目錄

贊助商

最新文章

搜索

區(qū)別:Python json.load()和json.loads()讀取JSON

作者:admin    時(shí)間:2021-12-27 9:53:53    瀏覽:

本文介紹如何使用 Python json.load()json.loads()方法從文件和字符串讀取 JSON 數(shù)據(jù)。

使用json.load()json.loads()方法,你可以將 JSON 編碼/格式化數(shù)據(jù)轉(zhuǎn)換為 Python 類型,此過程稱為 JSON 解碼。Python 內(nèi)置模塊 json 提供了以下兩種方法來解碼 JSON 數(shù)據(jù)。

 使用load和loads解析Python JSON
使用load和loads解析Python JSON

要從 URL 或文件解析 JSON,請使用json.load(),對于帶有 JSON 內(nèi)容的解析字符串,請使用json.loads()

json.load()和json.loads()的語法

我們可以使用load()loads()方法進(jìn)行許多 JSON 解析操作。首先,了解它的語法和參數(shù),然后我們將一一介紹其用法。

json.load()的語法

json.load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

json.loads()的語法

json.loads(s, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

所有參數(shù)在這兩種方法中都具有相同的含義。

使用的參數(shù):

  • json.load()用于從文件中讀取 JSON 文檔, 而json.loads()用于將 JSON String 文檔轉(zhuǎn)換為 Python 字典。
  • fp 用于讀取包含 JSON 文檔的文本文件、二進(jìn)制文件或 JSON 文件的文件指針。
  • object_hook 是可選函數(shù),將使用任何對象文字解碼的結(jié)果調(diào)用。Python 內(nèi)置的 json 模塊只能處理具有直接 JSON 等效項(xiàng)的原語類型(例如,字典、列表、字符串、數(shù)字、無等)。但是當(dāng)你想將 JSON 數(shù)據(jù)轉(zhuǎn)換成自定義的 Python 類型時(shí),我們需要實(shí)現(xiàn)自定義解碼器并將其作為對象傳遞object_hook給一個(gè)load()方法,這樣我們就可以獲得自定義的 Python 類型而不是字典。
  • object_pairs_hook 是一個(gè)可選函數(shù),它將使用任何對象字面量的結(jié)果調(diào)用,該結(jié)果是用有序的對列表解碼的。object_pairs_hook 將使用的返回值 代替 Python 字典。此功能還可用于實(shí)現(xiàn)自定義解碼器。如果 object_hook 也定義了, object_pairs_hook 則優(yōu)先。
  • parse_float 是可選參數(shù),但如果指定,將使用要解碼的每個(gè) JSON 浮點(diǎn)數(shù)和整數(shù)的字符串調(diào)用。默認(rèn)情況下,這等效于float(num_str)。
  • parse_int 如果指定,它將使用要解碼的每個(gè) JSON int 的字符串調(diào)用。默認(rèn)情況下,這等效于int(num_str). 

我們將詳細(xì)了解所有這些參數(shù)的使用。

json.load() 從文件中讀取 JSON 數(shù)據(jù)并將其轉(zhuǎn)換為字典

使用一種json.load()方法,我們可以從文本、JSON或二進(jìn)制文件中讀取 JSON 數(shù)據(jù)。該json.load()方法以 Python 字典的形式返回?cái)?shù)據(jù)。稍后我們使用這個(gè)字典來訪問和操作我們的應(yīng)用程序或系統(tǒng)中的數(shù)據(jù)。

解碼時(shí)JSON和Python實(shí)體之間的映射

請參考下面的轉(zhuǎn)換表,該表是json.load()json.loads()方法在解碼時(shí)使用的轉(zhuǎn)換表。 

Python JSON
dict object
list, tuple array
str string
int, float, int & float-derived Enums number
True true
False false
None null

現(xiàn)在,讓我們看看這個(gè)例子。在這個(gè)例子中,我正在讀取我硬盤上的“ developer.json ”文件。此文件包含以下 JSON 數(shù)據(jù)。

{
    "name": "Kaka",
    "salary": 9000,
    "skills": [
        "Raspberry pi",
        "Machine Learning",
        "Web Development"
    ],
    "email": "Kaka@webkaka.com",
    "projects": [
        "Python Data Mining",
        "Python Data Science"
    ]
}

示例

import json

print("Started Reading JSON file")
with open("developer.json", "r") as read_file:
    print("Converting JSON encoded data into Python dictionary")
    developer = json.load(read_file)

    print("Decoded JSON Data From File")
    for key, value in developer.items():
        print(key, ":", value)
    print("Done reading json file")

 輸出

Started Reading JSON file
Converting JSON encoded data into Python dictionary

Decoded JSON Data From File
name : kaka
salary : 9000
skills : ['Raspberry pi', 'Machine Learning', 'Web Development']
email : Kaka@webkaka.com
projects : ['Python Data Mining', 'Python Data Science']

Done reading json file

使用鍵名直接訪問 JSON 數(shù)據(jù)

使用以下代碼如果要直接訪問 JSON 密鑰而不是從文件中迭代整個(gè) JSON。

import json

print("Started Reading JSON file")
with open("developer.json", "r") as read_file:
    print("Converting JSON encoded data into Python dictionary")
    developer = json.load(read_file)

    print("Decoding JSON Data From File")
    print("Printing JSON values using key")
    print(developer["name"])
    print(developer["salary"])
    print(developer["skills"])
    print(developer["email"])
    print("Done reading json file")

輸出

Started Reading JSON file
Converting JSON encoded data into Python dictionary

Decoding JSON Data From File
Printing JSON values using key

kaka
9000
['Raspberry pi', 'Machine Learning', 'Web Development']
Kaka@webkaka.com

Done reading json file

你可以使用上述相同的方式從文本、json 或二進(jìn)制文件中讀取 JSON 數(shù)據(jù)。

json.loads() 將 JSON 字符串轉(zhuǎn)換為字典

有時(shí)我們會(huì)收到字符串格式的 JSON 響應(yīng)。因此,要在我們的應(yīng)用程序中使用它,我們需要將 JSON 字符串轉(zhuǎn)換為 Python 字典。使用該json.loads()方法,我們可以將包含 JSON 文檔的原生 String、byte 或 bytearray 實(shí)例反序列化為 Python 字典。我們可以參考文章開頭提到的轉(zhuǎn)換表。

import json

developerJsonString = """{
    "name": "kaka",
    "salary": 9000,
    "skills": [
        "Raspberry pi",
        "Machine Learning",
        "Web Development"
    ],
    "email": "kaka@webkaka.com",
    "projects": [
        "Python Data Mining",
        "Python Data Science"
    ]
}
"""

print("Started converting JSON string document to Python dictionary")
developerDict = json.loads(developerJsonString)

print("Printing key and value")
print(developerDict["name"])
print(developerDict["salary"])
print(developerDict["skills"])
print(developerDict["email"])
print(developerDict["projects"])

print("Done converting JSON string document to a dictionary")

輸出

Started converting JSON string document to Python dictionary

Printing key and value
jane doe
9000
['Raspberry pi', 'Machine Learning', 'Web Development']
JaneDoe@pynative.com
['Python Data Mining', 'Python Data Science']

Done converting JSON string document to a dictionary

解析和檢索嵌套的 JSON 數(shù)組鍵值

假設(shè)你有一個(gè)如下所示的 JSON 響應(yīng):

developerInfo = """{
    "id": 23,
    "name": "Kaka",
    "salary": 9000,
    "email": "kaka@webkaka.com",
    "experience": {"python":5, "data Science":2},
    "projectinfo": [{"id":100, "name":"Data Mining"}]
}
"""

例如,你想從開發(fā)人員信息 JSON 數(shù)組中檢索項(xiàng)目名稱,以了解他/她正在從事的項(xiàng)目。現(xiàn)在讓我們看看如何讀取嵌套的 JSON 數(shù)組鍵值。

在此示例中,我們使用了開發(fā)人員信息 JSON 數(shù)組,該數(shù)組具有作為嵌套 JSON 數(shù)據(jù)的項(xiàng)目信息和經(jīng)驗(yàn)。

import json

print("Started reading nested JSON array")
developerDict = json.loads(developerInfo)

print("Project name: ", developerDict["projectinfo"][0]["name"])
print("Experience: ", developerDict["experience"]["python"])

print("Done reading nested JSON Array")

輸出

Started reading nested JSON array
Project name:  Data Mining
Experience:  5
Done reading nested JSON Array

將 JSON 加載到 OrderedDict 中

OrderedDict 可以用作 JSON 的輸入。我的意思是,當(dāng)你將 JSON 轉(zhuǎn)儲(chǔ)到文件或字符串中時(shí),我們可以將 OrderedDict 傳遞給它。

但是,當(dāng)我們想要維護(hù)順序時(shí),我們將 JSON 數(shù)據(jù)加載回 OrderedDict 以便我們可以保持文件中鍵的順序。

現(xiàn)在讓我們看看例子。

import json
from collections import OrderedDict

print("Ordering keys")
OrderedData = json.loads('{"John":1, "Emma": 2, "Ault": 3, "Brian": 4}', object_pairs_hook=OrderedDict)
print("Type: ", type((OrderedData)))
print(OrderedData)

輸出

Ordering keys
Type:  <class 'collections.OrderedDict'>
OrderedDict([('John', 1), ('Emma', 2), ('Ault', 3), ('Brian', 4)])

如何使用json.load()的parse_float和parse_int

正如我已經(jīng)說過的parse_float和parse_int,兩者都是可選參數(shù),但如果指定,將使用要解碼的每個(gè) JSON 浮點(diǎn)數(shù)和整數(shù)的字符串調(diào)用。默認(rèn)情況下,這等效于float(num_str)int(num_str)。

假設(shè) JSON 文檔包含許多浮點(diǎn)值,并且你希望將所有浮點(diǎn)值四舍五入到兩位小數(shù)點(diǎn)。在這種情況下,我們需要定義一個(gè)自定義函數(shù)來執(zhí)行你想要的任何舍入。我們可以將這樣的函數(shù)傳遞給parse_float kwarg。

此外,如果你想對整數(shù)值執(zhí)行任何操作,我們可以編寫一個(gè)自定義函數(shù)并將其傳遞給parse_int kwarg。例如,你在 JSON 文檔中收到請假天數(shù),并且你想計(jì)算要扣除的工資。

例子

import json

def roundFloats(salary):
    return round(float(salary), 2)

def salartToDeduct(leaveDays):
    salaryPerDay = 465
    return int(leaveDays) * salaryPerDay

print("Load float and int values from JSON and manipulate it")
print("Started Reading JSON file")
with open("developerDetails.json", "r") as read_file:
    developer = json.load(read_file, parse_float=roundFloats,
                          parse_int=salartToDeduct)
    # after parse_float
    print("Salary: ", developer["salary"])

    # after parse_int
    print("Salary to deduct: ", developer["leavedays"])
    print("Done reading a JSON file")

輸出

Load float and int values from JSON and manipulate it
Started Reading JSON file
Salary:  9250.542
<class 'float'>
Salary to deduct:  3
Done reading a JSON file

在load()方法中使用JSON解碼器

Python 的內(nèi)置 json 模塊只能處理具有直接 JSON 等效項(xiàng)的 Python 原語類型(例如,字典、列表、字符串、數(shù)字、None 等)。

當(dāng)你執(zhí)行json.load()json.loads()方法時(shí),它會(huì)返回一個(gè) Python 字典。如果你想 將 JSON 轉(zhuǎn)換為自定義 Python 對象,那么我們可以編寫一個(gè)自定義 JSON 解碼器并將其傳遞給該json.loads()方法,這樣我們就可以獲得自定義 Class 對象而不是字典。

下面我們來看看如何在load()方法中使用JSON解碼器。在這個(gè)例子中,我們將看到如何使用load()方法的object_hook參數(shù)。

import json
from collections import namedtuple
from json import JSONEncoder

def movieJsonDecod(movieDict):
    return namedtuple('X', movieDict.keys())(*movieDict.values())

# class for your reference
class Movie:
    def __init__(self, name, year, income):
        self.name = name
        self.year = year
        self.income = income

# Suppose you have this json document.
movieJson = """{
    "name": "Interstellar",
    "year": 2014,
    "income": 7000000
}"""

# Parse JSON into an Movie object
movieObj = json.loads(movieJson, object_hook=movieJsonDecod)
print("After Converting JSON into Movie Object")
print(movieObj.name, movieObj.year, movieObj.income)

輸出

After Converting JSON into Movie Object
Interstellar 2014 7000000

總結(jié)

本文介紹了Python json.load()json.loads()讀取JSON的區(qū)別。通過本文,你將學(xué)會(huì)如何使用 Python json.load()json.loads()方法從文件和字符串讀取 JSON 數(shù)據(jù)。

您可能對以下文章也感興趣

標(biāo)簽: Python  
x
  • 站長推薦
/* 左側(cè)顯示文章內(nèi)容目錄 */