Python: Json反对,忽略某些字符

Python: Json to object, ignore certain characters

目前我正在使用 namedtuple class 将 json 转换为 Python 对象。这样我就可以轻松 select 数据,例如print(json.some_json_variable)。但是,我的 Json 包含以下键: "@odata.context" 当然不能用作变量名,因为它包含 "@"".".

目前我正在使用 json.load(json) 函数加载 json。然后我将 "@odata.context" 键重命名为 "odataContext",这样它就不再包含 "@" 和“.”。接下来,我使用 json.dumps(json) 将 json 转换为字符串,然后使用 json.loads(json) 函数将其转换为对象。如您所知,这种方法并不是很有效。

def load_json(input_json):
    with open(input_json, 'r') as l_json:
        data = json.load(l_json)
        data["odataContext"] = data.pop("@odata.context")
        data = json.dumps(data)
        data = json.loads(data, object_hook=lambda d: namedtuple('data', d.keys())(*d.values()))

有什么方法可以更有效地完成这项工作吗?我认为最多使用2个函数很容易实现,但我不知道如何实现。

我认为最简单的方法是在将 "@odata.context" 加载到 JSON 之前将其替换为 "odataContext"。尝试类似的东西:

def load_json(input_json):
    with open(input_json, 'r') as l_json:
        data = l_json.read().replace("@odata.context", "odataContext")
        data = json.loads(data, object_hook=lambda d: namedtuple('data', d.keys())(*d.values()))

您可以替换 object_hook= 参数 lambda 中不需要的字符:

json_data = '''{
    "@odata.context": 1,
    "variable": "Hello"
}'''

import json
from collections import namedtuple

def load_json(input_json):
    data = json.loads(input_json, object_hook=lambda d: namedtuple('data', (k.replace('@', '').replace('.', '_') for k in d.keys()) )(*d.values()))
    return data

data = load_json(json_data)
print(data.odata_context)
print(data.variable)

打印:

1
Hello