从嵌套JSON创建一个类



我正在努力解决这个问题,我必须从json-rpc客户端中创建一个类我得到这样的响应

{"jsonrpc":"2.0","id":1,"result":{"os":"linux","platform":"ubuntu","platformFamily":"debian","platformVersion":"20.04","kernelVersion":"5.4.0-107-generic","memoryTotal":4021989376,"memoryFree":725327872,"numCPU":2,"numGoroutine":169645}}

我想推断结果下的所有关键字/值,但我不知道如何做…

我试过了:

class foo:
def __init__(self, jsonrpc, id, result):
self.jsonrpc = jsonrpc
self.id = id
self.result = result              
@classmethod
def from_json(cls, json_str):
json_dict = json.loads(json_str)
return cls(**json_dict)

但是我的课在上层,对我没有用处。我还尝试在构造函数中添加其他关键字,但似乎无法达到编译器说arguments are missing的级别。

我个人建议使用dataclass-wizard完成此任务。这是一个建立在Python数据类模块之上的第三方JSON反/序列化库。

此外,该库还公开了一个名为wiz的命令行实用程序,可用于为任意JSON输入生成数据类模式,这在本例中肯定是有用的。

例如-在Mac/Linux上:

$ echo '{"jsonrpc":"2.0","id":1,"result":{"os":"linux","platform":"ubuntu","platformFamily":"debian","platformVersion":"20.04","kernelVersion":"5.4.0-107-generic","memoryTotal":4021989376,"memoryFree":725327872,"numCPU":2,"numGoroutine":169645}}' 
| wiz gs -x

导致以下数据类模式:

from __future__ import annotations
from dataclasses import dataclass
from dataclass_wizard import JSONWizard

@dataclass
class Data(JSONWizard):
"""
Data dataclass
"""
jsonrpc: float | str
id: int
result: Result

@dataclass
class Result:
"""
Result dataclass
"""
os: str
platform: str
platform_family: str
platform_version: float | str
kernel_version: str
memory_total: int
memory_free: int
num_cpu: int
num_goroutine: int

然后您可以使用from_json方法将上面原始问题中的JSON字符串作为数据类实例加载:

string = '{"jsonrpc":"2.0", ...}'
instance = Data.from_json(string)
print(repr(instance))

NB:您可能注意到的一点是,对于某些JSON值,如"jsonrpc": "2.0",生成的数据类模式显示为Union[float, str]

然后可以通过将-f / --force-strings选项传递给wiz工具,强制解析这些编码的数字字符串为相应的数字Python类型。生成的数据类字段应该显示为jsonrpc: float,例如。

最新更新