📜  将 JSON 数据转换为自定义Python对象

📅  最后修改于: 2022-05-13 01:54:35.780000             🧑  作者: Mango

将 JSON 数据转换为自定义Python对象

让我们看看如何在Python中将 JSON 数据转换为自定义对象。将 JSON 数据转换为自定义Python对象也称为解码反序列化 JSON 数据。要解码 JSON 数据,我们可以使用json.loads()json.load()方法和object_hook参数。使用 object_hook 参数,这样当我们执行 json.loads() 时,将使用 object_hook 的返回值而不是默认的 dict 值。我们也可以使用它来实现自定义解码器。
示例 1:

Python3
# importing the module
import json
from collections import namedtuple
 
# creating the data
data = '{"name" : "Geek", "id" : 1, "location" : "Mumbai"}'
 
# making the object
x = json.loads(data, object_hook =
               lambda d : namedtuple('X', d.keys())
               (*d.values()))
 
# accessing the JSON data as an object
print(x.name, x.id, x.location)


Python3
# importing the module
import json
from collections import namedtuple
 
# customDecoder function
def customDecoder(geekDict):
    return namedtuple('X', geekDict.keys())(*geekDict.values())
 
# creating the data
geekJsonData = '{"name" : "GeekCustomDecoder", "id" : 2, "location" : "Pune"}'
 
# creating the object
x = json.loads(geekJsonData, object_hook = customDecoder)
 
# accessing the JSON data as an object
print(x.name, x.id, x.location)


Python3
# importing the module
import json
try:
    from types import SimpleNamespace as Namespace
except ImportError:
    from argparse import Namespace
 
# creating the data
data = '{"name" : "GeekNamespace", "id" : 3, "location" : "Bangalore"}'
 
# creating the object
x = json.loads(data, object_hook = lambda d : Namespace(**d))
 
# accessing the JSON data as an object
print(x.name, x.id, x.location)


输出 :

正如我们在上面的示例中看到的, namedtuple是一个类,位于 collections 模块下。它包含映射到某些值的键。在这种情况下,我们可以使用键和索引来访问元素。我们还可以创建一个自定义解码器函数,在其中我们可以将 dict 转换为自定义Python类型并将值传递给 object_hook 参数,这将在下一个示例中进行说明。
示例 2:

Python3

# importing the module
import json
from collections import namedtuple
 
# customDecoder function
def customDecoder(geekDict):
    return namedtuple('X', geekDict.keys())(*geekDict.values())
 
# creating the data
geekJsonData = '{"name" : "GeekCustomDecoder", "id" : 2, "location" : "Pune"}'
 
# creating the object
x = json.loads(geekJsonData, object_hook = customDecoder)
 
# accessing the JSON data as an object
print(x.name, x.id, x.location)

输出 :

我们还可以使用 types 模块中的SimpleNamespace类作为 JSON 对象的容器。 SimpleNamespace 解决方案相对于 namedtuple 解决方案的优势: –

  1. 它更快,因为它不会为每个对象创建一个类。
  2. 它更短更简单。

示例 3:

Python3

# importing the module
import json
try:
    from types import SimpleNamespace as Namespace
except ImportError:
    from argparse import Namespace
 
# creating the data
data = '{"name" : "GeekNamespace", "id" : 3, "location" : "Bangalore"}'
 
# creating the object
x = json.loads(data, object_hook = lambda d : Namespace(**d))
 
# accessing the JSON data as an object
print(x.name, x.id, x.location)

输出 :