jsonpath_rw for Python: 如何相对导航?
jsonpath_rw for Python: How to navigate relatively?
我有一个配置数据库存储在 json 文件中。此文件从磁盘读取,由 Pythons json 库解析并存储在名为 json
.
的变量中
现在我正在研究 jsonpath_rw 以构建更具可读性的路径表达式,然后编写纯 Python 代码来访问多个嵌套的字典和数组。
这是我当前的代码:
# select all UART device serial numbers
exprSerial = parse('FPGAList.[*].UART.Serial')
#for serial in UART serial list
for match in exprSerial.find(json):
print("Match: " + match.value + " Path:" + str(match.full_path))
if (match.value == USBSerial):
#exprUART = match.full_path.Descendants) #under construction
第一个表达式列出所有 UART 设备序列号。结果显示在屏幕上并正在运行。关于在线文档,我可以通过访问match.full_path
打印出匹配对象的完整路径。这是一个 jsonpath 对象。如果我对其调用 str(..)
,它会转换为可读字符串。
接下来,我的代码将值与给定的序列号进行比较。如果是真的,我想检查一些其他参数以确保安全:例如USBDeviceVendor
。此密钥也存储在同一层级的 json 文件中。
我的目标是构建一个相对于 match.full_path
的新 json 路径以访问 USBDeviceVendor
。
错误的解决方案: exprVendor = parse(str(match.full_path) + "..USBDeviceVendor")
是否可以像 match.full_path.relative("..USBDeviceVendor")
一样扩展 match.full_path
?
如果你想上一层然后再下一层。而不是寻找当前结果的匹配后代。
使用`parent`
:
parse('`parent`.USBDeviceVendor').find(match)
考虑:
>>> import jsonpath_rw as jp
>>> obj = {'y':{'x':1,'g':{'t':0}}}
>>> jp.parse('`parent`.g').find(jp.parse("y.x").find(obj)[0])[0].value
{'t': 0}
否则:
parse("`this`..USBDeviceVendor").find(match)
考虑:
>>> import jsonpath_rw as jp
>>> obj = {'y':{'x':{'g':{'t':0}}}}
>>> jp.parse("`this`..t").find(jp.parse("y.x").find(obj)[0])[0].value
0
我有一个配置数据库存储在 json 文件中。此文件从磁盘读取,由 Pythons json 库解析并存储在名为 json
.
现在我正在研究 jsonpath_rw 以构建更具可读性的路径表达式,然后编写纯 Python 代码来访问多个嵌套的字典和数组。
这是我当前的代码:
# select all UART device serial numbers
exprSerial = parse('FPGAList.[*].UART.Serial')
#for serial in UART serial list
for match in exprSerial.find(json):
print("Match: " + match.value + " Path:" + str(match.full_path))
if (match.value == USBSerial):
#exprUART = match.full_path.Descendants) #under construction
第一个表达式列出所有 UART 设备序列号。结果显示在屏幕上并正在运行。关于在线文档,我可以通过访问match.full_path
打印出匹配对象的完整路径。这是一个 jsonpath 对象。如果我对其调用 str(..)
,它会转换为可读字符串。
接下来,我的代码将值与给定的序列号进行比较。如果是真的,我想检查一些其他参数以确保安全:例如USBDeviceVendor
。此密钥也存储在同一层级的 json 文件中。
我的目标是构建一个相对于 match.full_path
的新 json 路径以访问 USBDeviceVendor
。
错误的解决方案: exprVendor = parse(str(match.full_path) + "..USBDeviceVendor")
是否可以像 match.full_path.relative("..USBDeviceVendor")
一样扩展 match.full_path
?
如果你想上一层然后再下一层。而不是寻找当前结果的匹配后代。
使用`parent`
:
parse('`parent`.USBDeviceVendor').find(match)
考虑:
>>> import jsonpath_rw as jp
>>> obj = {'y':{'x':1,'g':{'t':0}}}
>>> jp.parse('`parent`.g').find(jp.parse("y.x").find(obj)[0])[0].value
{'t': 0}
否则:
parse("`this`..USBDeviceVendor").find(match)
考虑:
>>> import jsonpath_rw as jp
>>> obj = {'y':{'x':{'g':{'t':0}}}}
>>> jp.parse("`this`..t").find(jp.parse("y.x").find(obj)[0])[0].value
0