Python:Json到对象,忽略某些字符

Python:Json到对象,忽略某些字符,python,json,odata,namedtuple,Python,Json,Odata,Namedtuple,目前,我正在使用namedtuple类将json转换为Python对象。这样,我可以轻松地为printjson.some_json_变量选择数据。但是,我的Json包含以下键:@odata.context,当然,这不能用作变量名,因为它包含@和 目前,我正在使用json.loadjson函数来加载json。然后我将@odata.context键重命名为odataContext,这样它就不再包含@和。。接下来,我使用json.dumpsjson将json转换为字符串,然后使用json.loadsj

目前,我正在使用namedtuple类将json转换为Python对象。这样,我可以轻松地为printjson.some_json_变量选择数据。但是,我的Json包含以下键:@odata.context,当然,这不能用作变量名,因为它包含@和

目前,我正在使用json.loadjson函数来加载json。然后我将@odata.context键重命名为odataContext,这样它就不再包含@和。。接下来,我使用json.dumpsjson将json转换为字符串,然后使用json.loadsjson函数将其转换为对象。正如你所理解的,这种方法并不是很有效

def load_jsoninput_json: 使用openinput_json,“r”作为l_json: data=json.loadl\u json 数据[odataContext]=数据。pop@odata.context data=json.dumpsdata data=json.loadsdata,object_hook=lambda d:namedtuple'data',d.keys*d.values
有没有什么方法可以更有效地做到这一点?我认为最多可以使用2个函数,但我不知道如何实现。

我认为最简单的方法是在将@odata.context加载到JSON之前,用odataContext替换@odata.context。尝试以下方法:

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()))

可以替换对象_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