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
目前我正在使用 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