使用 jsonpath-ng 在 Python 中使用上下文更新 json 数据
Update json data with context in Python using jsonpath-ng
关注 ,想知道如何在给定特定上下文的情况下更新 JSON 数据。
因此,假设我们选择了完全相同的 JSON 示例:
{
"SchemeId": 10,
"nominations": [
{
"nominationId": 1
}
]
}
但是这一次,想要将原始值的值加倍,因此需要一些 lambda 函数来考虑当前节点值。
不需要 lambda;例如,要加倍 SchemeId
,这样的事情应该可行:
data = json.loads("""the json string above""")
jsonpath_expr = parse('$.SchemeId')
jsonpath_expr.find(data)
val = jsonpath_expr.find(data)[0].value
jsonpath_expr.update(data, val*2)
print(json.dumps(data, indent=2))
输出:
{
"SchemeId": 20,
"nominations": [
{
"nominationId": 1
}
]
}
这里是 lambda 表达式的例子:
import json
from jsonpath_ng import parse
settings = '''{
"choices": {
"atm": {
"cs": "Strom",
"en": "Tree"
},
"bar": {
"cs": "Dům",
"en": "House"
},
"sea": {
"cs": "Moře",
"en": "Sea"
}
}
}'''
json_data = json.loads(settings)
pattern = parse('$.choices.*')
def magic(f: dict, to_lang='cs'):
return f[to_lang]
pattern.update(json_data,
lambda data_field, data, field: data.update({field: magic(data[field])}))
json_data
returns
{
'choices': {
'atm': 'Strom',
'bar': 'Dům',
'sea': 'Moře'
}
}
关注
{
"SchemeId": 10,
"nominations": [
{
"nominationId": 1
}
]
}
但是这一次,想要将原始值的值加倍,因此需要一些 lambda 函数来考虑当前节点值。
不需要 lambda;例如,要加倍 SchemeId
,这样的事情应该可行:
data = json.loads("""the json string above""")
jsonpath_expr = parse('$.SchemeId')
jsonpath_expr.find(data)
val = jsonpath_expr.find(data)[0].value
jsonpath_expr.update(data, val*2)
print(json.dumps(data, indent=2))
输出:
{
"SchemeId": 20,
"nominations": [
{
"nominationId": 1
}
]
}
这里是 lambda 表达式的例子:
import json
from jsonpath_ng import parse
settings = '''{
"choices": {
"atm": {
"cs": "Strom",
"en": "Tree"
},
"bar": {
"cs": "Dům",
"en": "House"
},
"sea": {
"cs": "Moře",
"en": "Sea"
}
}
}'''
json_data = json.loads(settings)
pattern = parse('$.choices.*')
def magic(f: dict, to_lang='cs'):
return f[to_lang]
pattern.update(json_data,
lambda data_field, data, field: data.update({field: magic(data[field])}))
json_data
returns
{
'choices': {
'atm': 'Strom',
'bar': 'Dům',
'sea': 'Moře'
}
}