簡體   English   中英

如何使用 JQ 從 JSON 中刪除不必要的項目?

[英]How to remove unnecessary items from an JSON with JQ?

我需要從這個:(示例)

{
  "jobs": [
      {},
      {}
    ],
  "services": {
    "service-1": {
      "version": "master"
    },
    "service-2": {
      "foo": true,
      "version": "master"
    },
    "service-3": {
      "bar": "baz"
    }
  }
}

做這個:

{
  "services": {
    "service-1": {
      "version": "master"
    },
    "service-2": {
      "version": "master"
    }
  }
}

所以刪除除.services.*.version之外的所有內容。 請幫助,以我對 JQ 的了解無法處理它。

如果您想區分“版本”不存在或為空:

{services}
| .services |= map_values(select(has("version")) | {version} )

非常籠統地翻譯你的表達式.services.*.version ,你可以使用tostream如下:

reduce (tostream
        | select(length==2 and
                 (.[0] | (.[0] == "services" and
                          .[-1] == "version")))) as $pv (null;
    setpath($pv[0]; $pv[1]) )

使用 jq 的流解析器

為了減少內存需求,您可以修改上述解決方案以使用 jq 的流解析器,或者使用上面的reduce ,或者使用fromstream

jq -n --stream -f program.jq input.json

其中 program.jq 包含:

fromstream(inputs
    | select( if length == 2
              then .[0] | (.[0] == "services" and
                           .[-1] == "version")
              else . end ) )

.services.*.version.*

更廣泛地解釋.services.*.version以便不要求路徑的終端組件為.version ,只需將.[-1] == "version"替換為:

index("version")

在上面。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM