我可以在 python -mjson.tool 命令中使用过滤条件来选择具有特定属性的对象吗?
例如,我有一个 example.json 文件,其中包含两个对象,其中两个对象具有属性“test”:“pi”。我只需要获取这两个对象。
答案1
嵌套数据结构(如 JSON)必须由相关工具(例如此处的 json-aware)进行解析,才能正确提取信息。尝试仅使用行感知例程(如 grep/sed/awk/等)操作嵌套数据结构,将产生失败和误报。例如,只有当您的 JSON 打印得很漂亮且每个 JSON 元素每行一个时,上述答案才有效。尽管如果 JSON 以其他方式打印(即在一行中,或者在同一行上有多个元素),它会失败。
因此,如果您使用 python,则必须解析该对象,然后以编程方式提取所需的数据(即用 python 编写脚本)。
然而,还有另一种方法:对于unix,有一些开发的或支持json的实用程序可以很容易地实现像您这样的要求,例如jq、jtc(以及许多其他)。下面我就给大家展示一下解决方案JTC:
假设您有以下 json:
bash $ cat file.json
{
"Root": [
{
"data": "2.71",
"test": "e"
},
{
"data": "3.14",
"test": "pi"
}
]
}
bash $
然后,为了提取包含 的所有对象"test": "pi"
,使用jtc
如下所示:
bash $ cat file.json | jtc -w'[test]:<pi>: [-1]'
{
"data": "3.14",
"test": "pi"
}
bash $
walk-path ( -w
) 参数的解释:
1.[test]:<pi>:
将找到所有类似的元素"test": "pi"
(如果有多个)
2.[-1]
将从找到的元素上升 1 个 JSON 层。
将打印结果步行。
请在此处查阅jtc
完整的用户指南:https://github.com/ldn-softdev/jtc/blob/master/User%20Guide.md
答案2
我相信答案是否定的。我不是Python专家,但我看过代码。我没有看到该工具的任何选项。
我最近也遇到了同样的问题,我刚刚通过管道grep我正在寻找的内容。 grep 允许您查看匹配行之前和/或之后的行,以便您可以查看整个子句。
... | pythom -m json.tool | grep -E -B 3 -A 5 'test.*:.*pi'
这将显示任何包含“测试”的行之前 3 行和之后 5 行 [something] : [something] pi