json - 如何创建 key :value list from JSON? key 名称应包含对象本身的一些值

标签 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
...

最佳答案

使用单个 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 with "\(.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

关于json - 如何创建 key :value list from JSON? key 名称应包含对象本身的一些值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50029781/

相关文章:

arrays - 如何使用jq根据内部数组中的值过滤对象数组?

json - 如何使用 express.js 传递 API url JSON http.get res.json(data)

java - JsonReader.setLenient(true) 在第 1 行第 1 列路径 $ Error 处接受格式错误的 JSON

linux - 从 csv 文件中删除特定列,在输出中保持相同的结构

xml - 在带有 not() 的 bash 中使用 XPath

select - jq 选择并包含错误 : null (null) and string ("randomtext1") cannot have their containment checked

json - 使用 jq 解析两个列表中存在的键(即使其中一个列表中可能不存在)

json - 模板正文包含无效的 JSON : invalid character

ios - 在 objective-c 中解析多行json

bash - 在 Windows 10 的 WSL 终端中禁用蜂鸣声