我正在努力解决这个问题,我必须从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
,例如。