我最终想要的结构是:
{
"catalog": [
{
"name": "X",
"catalog": [
{ "name": "Y", "uniqueId": "Z" },
{ "name": "Q", "uniqueId": "B" }
]
}
]
}
这是现有结构的样子,除了每个级别(https://gist.github.com/ajcrites/e0e0ca4ca3a08ff2dc401ec872e6094c)都有许多其他属性。我只想过滤掉那些并获得一个看起来非常像这样的JSON格式。
我已经开始使用:jq '.catalog'
,但这只返回数组。我仍然想要那里的catalog
属性名称。我可以使用jq '{catalog: .catalog[]}
执行此操作,但这会分别打印出每个目录对象,这会使整个输出无效JSON。我仍然希望属性在数组中。有没有办法使用jq?
答案 0 :(得分:2)
以下内容将给定输入转换为所需的输出,可能就是您想要的:
{catalog}
| .catalog |= map( {name, catalog} )
| .catalog[].catalog |= map( {name, uniqueId} )
| .catalog |= .[0:1]
但是,我不清楚这是你想要的,因为你没有讨论给定JSON输入中的重复。所以也许你真的不想要上面的最后一行,或者你想要以其他方式处理重复项,或者.......
无论如何,在这里保持简单的诀窍是使用|=
。
另一种方法是使用del
删除不需要的属性(而不是选择你想要的属性),但在目前的情况下,这将是(最好的)乏味。
答案 1 :(得分:0)
您可以先使用 tostream 转换sample.json
通过运行
jq -c tostream sample.json
这将生成
[["catalog",0,"catalog",0,"name"],"Y"]
[["catalog",0,"catalog",0,"prop11"],""]
[["catalog",0,"catalog",0,"uniqueId"],"Z"]
[["catalog",0,"catalog",0,"uniqueId"]]
[["catalog",0,"catalog",1,"name"],"Y"]
[["catalog",0,"catalog",1,"prop11"],""]
...
reduce 和 setpath 可用于转换回 具有过滤器的原始表单,例如:
reduce (tostream|select(length==2)) as [$p,$v] (
{};
setpath($p;$v)
)
添加条件可以轻松省略任何级别的属性。 例如,以下删除以“prop”开头的叶属性:
reduce (tostream|select(length==2)) as [$p,$v] (
{};
if $p[-1]|startswith("prop")
then .
else setpath($p;$v)
end
)
使用sample.json
生成
{
"catalog": [
{
"catalog": [
{
"name": "Y",
"uniqueId": "Z"
},
{
"name": "Y",
"uniqueId": "Z"
}
],
"name": "X"
},
{
"catalog": [
{
"name": "Y",
"uniqueId": "Z"
},
{
"name": "Y",
"uniqueId": "Z"
}
],
"name": "X"
}
]
}
答案 2 :(得分:0)
如果目标是删除某些属性,则可以使用walk/1
来删除。例如,要删除名称以" prop":
walk(if type == "object"
then with_entries(select(.key|startswith("prop") | not))
else . end)
如果重点是保留某些属性,同样的方法也适用,例如:
walk(if type == "object"
then with_entries(select(.key == "name" or .key == "uniqueId" or .key == "catalog"))
else . end)
答案 3 :(得分:0)
您可以构建一个文件,其中包含要保留的json(表示为数组)的路径。然后过滤掉那些不适合这些路径的值。
paths.json:
<style name="slideUpAnimation">
<item name="android:windowEnterAnimation">@anim/slide_in_bottom</item>
<item name="android:windowExitAnimation">@anim/slide_out_bottom</item>
</style>
然后根据路径过滤值。使用流是一种很好的方法,因为它可以直接访问这些路径:
["catalog","name"]
["catalog","catalog","name"]
["catalog","catalog","uniqueId"]