jq json将对象移动到嵌套对象并迭代未知名称/对象数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jq json将对象移动到嵌套对象并迭代未知名称/对象数相关的知识,希望对你有一定的参考价值。

我一直在寻找几个'jq'解析json字符串的例子,都非常有用,但对我的特定问题没有定论

这是我的输入json:

{
    "outcome" : "TrBean",
    "result" : {"TrAct" : {
        "executiontime" : 16938570,
        "invocations" : 133863,
        "waittime" : 4981
    }}
}
{
    "outcome" : "WwwBean",
    "result" : {}
}
{
  "outcome": "CRFeatureBean",
  "result": {
    "CRChannels": {
      "executiontime": 78127,
      "invocations": 9983,
      "waittime": 213
    },
    "getCRChannels": {
      "executiontime": 98704,
      "invocations": 10113,
      "waittime": 212
    },
    "getCRToMigrate": {
      "executiontime": 32,
      "invocations": 4,
      "waittime": 0
    },
    "getCRId": {
      "executiontime": 28198633,
      "invocations": 747336,
      "waittime": 19856
    }
  }
}

我正在尝试通过collectd exec插件(PUTVAL)提供石墨,所以我需要一行中的信息。我尝试使用./jq '.result|to_entries[]|{"method:" .key, "inv": .value.invocations}|"PUTVAL (.method)/invoke:(.invokes)"' ......但我也需要在每一行都有“结果”。

另外,我不知道数量,也不知道结果对象的名称

所以,我想最终得到:

TrBean_TrAct
WwwBean
CRFeatureBean_CRChannels
CRFeatureBean_getCRChannels
CRFeatureBean_getCRToMigrate
CrFeatureBean_getCRId
答案

使用-r命令行选项调用jq时,以下jq过滤器将生成所需的输出:

((.result | keys_unsorted[]) // null) as $key
| if $key == null then .outcome
  else [.outcome, $key] | join("_")
  end

当然有许多可能的变化,例如

((.result | keys_unsorted[]) // null) as $key
| [.outcome, ($key // empty)]
| join("_")

或者如果你想要一个短的单行:

.outcome + ("_" + (.result | keys_unsorted[]) // null)

无论如何,这里简单的关键是生成.result的密钥作为流。处理“边缘情况”使解决方案稍微复杂一些,即.outcome + "_" + (.result | keys_unsorted[])

示例调用:jq -r -f program.jq input.json

以上是关于jq json将对象移动到嵌套对象并迭代未知名称/对象数的主要内容,如果未能解决你的问题,请参考以下文章

使用 jq 展平嵌套的 JSON

使用嵌套对象迭代 json 并根据属性值进行过滤

将包含许多嵌套对象的JSON文件保存到列表中

使用 JQ 展平嵌套的 Json 对象

使用JQ从JSON中选择特定的,任意嵌套的对象

使用 jq 为 JSON 对象的嵌套数组中的属性展平数组