如何从JSON创建密钥:值列表?键名应包含来自对象本身的一些值

时间:2018-04-25 19:13:44

标签: json bash jq

我正在尝试解析JSON并将某些值存储为Graphite中的指标。 为了使我的Graphite更加用户友好,我必须形成一个度量名称,它包含来自其对象的一些值。 我在bash循环+ jq上得到了解决方案,但它确实很慢。所以我在寻求帮助:))

以下是我的意见:

{
...
  },
  "Johnny Cage": {
    "firstname": "Johnny",
    "lastname": "Cage",
    "height": 183,
    "weight": 82,
    "hands": 2,
    "legs": 2,
    ...
  },
  ...
}

期望的输出:

mk.fighter.Johnny.Cage.firstname Johnny
mk.fighter.Johnny.Cage.lastname Cage
mk.fighter.Johnny.Cage.height 183
mk.fighter.Johnny.Cage.weight 82
mk.fighter.Johnny.Cage.hands 2
mk.fighter.Johnny.Cage.legs 2
...

1 个答案:

答案 0 :(得分:2)

使用单个 jq 命令:

示例input.json

{
  "Johnny Cage": {
    "firstname": "Johnny",
    "lastname": "Cage",
    "height": 183,
    "weight": 82,
    "hands": 2,
    "legs": 2
  }
}
jq -r 'to_entries[] | (.key | sub(" "; ".")) as $name 
       | .value | to_entries[]
       | "mk.fighter.\($name).\(.key) \(.value)"' input.json

要将$name作为内部firstnamelastname键的组合,将(.key | sub(" "; ".")) as $name替换为"\(.value.firstname).\(.value.lastname)" as $name

输出:

mk.fighter.Johnny.Cage.firstname Johnny
mk.fighter.Johnny.Cage.lastname Cage
mk.fighter.Johnny.Cage.height 183
mk.fighter.Johnny.Cage.weight 82
mk.fighter.Johnny.Cage.hands 2
mk.fighter.Johnny.Cage.legs 2