我找不到有关如何更新具有不同深度的复杂路径的原始JSON消息值的任何信息。
我尝试了jsonpath
库,但这是有关获取值而不是设置值的文档。
例如,我具有以下JSON:
{"very":{"long":{"path":{"A":"1"}}},"other":{"path":{"even":{"deeper":{"B":"2"}}}}}
可以在函数外部指定两个路径。
这一个映射到"1"
:
very.long.path.A
然后将其发送到"2"
:
other.path.even.deeper.B
jsonpath
可以从提供的路径中提取值,但是我的目标是修改它们。
可以做到以下几点的理想选择:
old_json = '{"very":{"long":{"path":{"A":"1"}}},"other":{"path":{"even":{"deeper":{"B":"2"}}}}}'
path = "other.path.even.deeper.B"
value = "100500"
new_json = jsonparser.update_value(old_json, path, value)
有没有可以提供此类功能的库?
答案 0 :(得分:0)
要解码json,您可以使用内置的json库。这是非常容易使用。它将json数据转换为有效的python对象。 See Encoders and decoders
对于您而言,这主要是一个命令。要访问字典中的元素,请参见python dictionaries。
现在,您需要将路径拆分为单独的键keys = path.split(".")
并迭代到最后一个。
element = json_decoded_root
for key in keys[:-1]:
element = element.setdefault(key, {})
element[keys[-1]] = new_value
json.dump(file, data) # Writing to file
或
new_json = json.dumps(data) # Writing in string
我不知道我是否理解您,但是此示例说明了为什么更改字典中的值时不丢失数据。
>>> example = {"A" : 20, "B": 10}
>>> example["A"] = 30
>>> example
{'A': 30, 'B': 10}
您可以在丢失数据时“丢失”数据。例如
>>> example = {"A" : {"C": 10}, "B": 10}
>>> example["A"] = 30
>>> example
{'A': 30, 'B': 10}
在这里“丢失”了包含“ C”键的字典