首頁 > 軟體

利用python實現JSON檔案與Python物件互相轉換

2022-06-13 14:02:24

前言:

如何將一個JSON檔案對映為Python物件主要包括一下三個部分:

  • 考點:loads函數的用法。
  • 面試題:如何將一個JSON檔案對映為Python物件?
  • 解析

一、將一個JSON檔案對映為Python物件

第一種方法

供我們讀取的JSON檔案是test.json,檔案內容如下:

{
  "name": "孤寒者",
  "age": 18,
  "height": 130
}

首先,我們可以通過json模組的loads()方法將JSON檔案轉為Python字典型別:

# coding=utf-8
import json

with open('test.json', 'r', encoding='utf-8') as f:
    jsonStr = f.read()

    product = json.loads(jsonStr)
    print(type(product))
    print(product['name'])

我們在loads()方法裡使用物件勾點即可實現將一個JSON檔案對映為Python物件。分析思路:

  • 我們使用物件勾點實質上總共做了兩步:先通過loads()方法將JSON檔案轉換為dict物件,然後將這個dict物件同時建立Product物件->將dict物件作為引數傳入Product物件的構造方法__init__()方法中的第二個引數,即d。而這個d其實就是包含了這個JSON檔案的字典物件,我們又在__init__()方法中將d賦值給了__dict__(就相當於你一個個寫類裡面的屬性名=屬性值),這就會將字典裡的key和value對映為Product物件裡的屬性和屬性值。
# coding=utf-8
import json
class Product:
    def __init__(self, d):
        self.__dict__ = d
with open('test.json', 'r', encoding='utf-8') as f:
    jsonStr = f.read()
    product = json.loads(jsonStr, object_hook=Product)
    print(type(product))
    # print(product['name'])        # 這樣就不行了~
    print(product.name)

第二種方法

也是使用了物件勾點,不過與第一種方法不同的是,此時物件勾點指定的不再是類,而是指定一個轉換函數,通過這個函數返回物件。

# coding=utf-8
import json

class Product:
    def __init__(self, d):
        self.__dict__ = d
with open('test.json', 'r', encoding='utf-8') as f:
    jsonStr = f.read()
    def json2Product(d):
        return Product(d)
    product1 = json.loads(jsonStr, object_hook=json2Product)

    print(type(product1))
    print(product1.name)

小結:

json模組的loads函數可以裝載JSON檔案,並將其轉換為JSON物件。關鍵需要通過object_hook引數指定勾點物件,然後在類的構造方法中將傳入的JSON物件賦給內部變數__init__

二、將一個Python物件轉換為對應的JSON字串

包括以下三點考點:

  • dumps函數的用法。
  • 面試題
    • 1.面試題一:將一個Python物件轉換為對應的JSON字串。
    • 2.面試題二:將物件列表轉換為JSON陣列。
  • 解析:面試題一 之 將一個Python物件轉換為對應的JSON字串:

使用dumps()函數,關鍵點是使用轉換函數~

# coding=utf-8
import json
class Product:
    def __init__(self, name, age, height):
        self.name = name
        self.age = age
        self.height = height
product = Product('孤寒者', 18, 130)

def product2Dict(obj):
    return {
        'name': obj.name,
        'age': obj.age,
        'height': obj.height
    }
# dumps()方法的default引數指定轉換函數。
jsonStr = json.dumps(product, default=product2Dict, ensure_ascii=False)
print(jsonStr)
print(type(jsonStr))

面試題二 之 將物件列表轉換為JSON陣列

  • 為了實現這一功能,我們需要一個物件列表,所以我們將JSON檔案(如下test.json檔案)先轉為物件列表(上一題中我們已經知道如何操作了~),然後再給它轉為JSON陣列。
[
  {
    "name": "孤寒者",
    "age": 18,
    "height": 130
  },
  {
    "name": "小張",
    "age": 18,
    "height": 80
  }
]
# coding=utf-8
import json
class Product:
    def __init__(self, d):
        self.__dict__ = d
with open('test.json', 'r', encoding='utf-8') as f:
    jsonStr = f.read()
    products = json.loads(jsonStr, object_hook=Product)
    print(products)

上面截圖可以看出來我們確實已經將JSON檔案轉為物件列表了~ 下面開始解題:

# coding=utf-8
import json
class Product:
    def __init__(self, d):
        self.__dict__ = d
with open('test.json', 'r', encoding='utf-8') as f:
    jsonStr = f.read()
    products = json.loads(jsonStr, object_hook=Product)
    print(products)
    for product in products:
        print(product.name)
    print("*"*25)
    # 解題部分:
    def product2Dict(obj):
        return {
            'name': obj.name,
            'age': obj.age,
            'height': obj.height
        }
    jsonStr = json.dumps(products, default=product2Dict, ensure_ascii=False)
    print(jsonStr)
    print(type(jsonStr))

總結

  • json模組的dumps函數用於將物件轉換為JSON字串。
  • 通過default引數指定一個轉換函數,可以在該函數中提取物件的屬性值,並生成JSON物件,最後dumps負責將轉換函數返回的JSON物件轉換為JSON字串。

到此這篇關於利用python實現JSON檔案與Python物件互相轉換的文章就介紹到這了,更多相關JSON對映內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com