You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用jq筛选JSON指定字段、添加关联字段并调整数值格式

解决Staking解绑委托数据的格式调整问题

问题场景

我需要处理以下Staking解绑委托的JSON数据:

{
  "unbonding_responses": [
    {
      "delegator_address": "tori1zkzfu5tqee0p698w3g83x8a2zswgqglj4t8z3j",
      "validator_address": "torivaloper189r2mx8h5zt7ep4cf0s4np79w38l420na3h6sa",
      "entries": [
        {
          "creation_height": "753019",
          "completion_time": "2022-12-13T16:00:56.664864370Z",
          "initial_balance": "3000000",
          "balance": "3000000"
        }
      ]
    },
    {
      "delegator_address": "tori1rjg0vg9hlu8kygnrdehzt3z0t4ea5ssu6wkm06",
      "validator_address": "torivaloper189r2mx8h5zt7ep4cf0s4np79w38l420na3h6sa",
      "entries": [
        {
          "creation_height": "653923",
          "completion_time": "2022-12-07T00:53:48.247870844Z",
          "initial_balance": "50000000",
          "balance": "50000000"
        }
      ]
    },
    {
      "delegator_address": "tori1aw44evl5zlqtw93zln83tp4v3w4kp6e9zmx64k",
      "validator_address": "torivaloper189r2mx8h5zt7ep4cf0s4np79w38l420na3h6sa",
      "entries": [
        {
          "creation_height": "597161",
          "completion_time": "2022-12-03T05:32:59.107845572Z",
          "initial_balance": "2000000",
          "balance": "2000000"
        }
      ]
    }
  ],
  "pagination": {
    "next_key": null,
    "total": "3"
  }
}

目前我使用这条命令处理数据:

curl -s https://rest.mainnet.teritori.com/cosmos/staking/v1beta1/validators/torivaloper1qy38xmcrnht0kt5c5fryvl8llrpdwer6atxj5u/unbonding_delegations | jq '.unbonding_responses[].entries[]|.balance|=(tonumber | ./1000000)'

得到的结果如下:

{
  "creation_height": "546726",
  "completion_time": "2022-11-29T20:41:54.102529873Z",
  "initial_balance": "1000000",
  "balance": 1
}
{
  "creation_height": "560257",
  "completion_time": "2022-11-30T18:22:32.286053755Z",
  "initial_balance": "4000000",
  "balance": 4
}
{
  "creation_height": "567462",
  "completion_time": "2022-12-01T05:57:49.397647828Z",
  "initial_balance": "112142",
  "balance": 0.112142
}

我尝试用map和select调整格式但未成功,现在需要实现两个核心需求:

  • 移除结果中的initial_balance字段
  • 将外层的delegator_address字段添加到每条结果中
    最终得到便于转换为CSV并导入表格的格式:
{
  "delegator_address": "tori1zkzfu5tqee0p698w3g83x8a2zswgqglj4t8z3j",
  "creation_height": "546726",
  "completion_time": "2022-11-29T20:41:54.102529873Z",
  "balance": 1
}
{
  "delegator_address": "tori1rjg0vg9hlu8kygnrdehzt3z0t4ea5ssu6wkm06",
  "creation_height": "560257",
  "completion_time": "2022-11-30T18:22:32.286053755Z",
  "balance": 4
}
{
  "delegator_address": "tori1aw44evl5zlqtw93zln83tp4v3w4kp6e9zmx64k",
  "creation_height": "567462",
  "completion_time": "2022-12-01T05:57:49.397647828Z",
  "balance": 0.112142
}

解决方案

使用以下jq命令即可实现需求:

curl -s https://rest.mainnet.teritori.com/cosmos/staking/v1beta1/validators/torivaloper1qy38xmcrnht0kt5c5fryvl8llrpdwer6atxj5u/unbonding_delegations | jq '.unbonding_responses[] | .delegator_address as $addr | .entries[] | {delegator_address: $addr, creation_height, completion_time, balance: (.balance | tonumber / 1000000)}'

命令拆解说明

  1. .unbonding_responses[]:遍历每个解绑委托的顶层条目
  2. .delegator_address as $addr:将当前条目的delegator_address存入变量$addr,方便后续复用
  3. .entries[]:遍历当前解绑委托下的每条具体记录
  4. {delegator_address: $addr, creation_height, completion_time, balance: (.balance | tonumber / 1000000)}:构造目标格式对象:
    • 手动添加delegator_address字段,值为之前存储的$addr
    • 保留creation_height和completion_time字段
    • 转换balance字段为数字并除以1000000完成单位换算
    • 自动排除initial_balance字段(因为新对象未包含该字段)

执行结果

运行上述命令后,将直接得到你需要的目标格式:

{
  "delegator_address": "tori1zkzfu5tqee0p698w3g83x8a2zswgqglj4t8z3j",
  "creation_height": "546726",
  "completion_time": "2022-11-29T20:41:54.102529873Z",
  "balance": 1
}
{
  "delegator_address": "tori1rjg0vg9hlu8kygnrdehzt3z0t4ea5ssu6wkm06",
  "creation_height": "560257",
  "completion_time": "2022-11-30T18:22:32.286053755Z",
  "balance": 4
}
{
  "delegator_address": "tori1aw44evl5zlqtw93zln83tp4v3w4kp6e9zmx64k",
  "creation_height": "567462",
  "completion_time": "2022-12-01T05:57:49.397647828Z",
  "balance": 0.112142
}

额外:直接输出CSV格式

如果需要直接生成可导入表格的CSV,可以在命令后追加CSV转换逻辑:

curl -s https://rest.mainnet.teritori.com/cosmos/staking/v1beta1/validators/torivaloper1qy38xmcrnht0kt5c5fryvl8llrpdwer6atxj5u/unbonding_delegations | jq '.unbonding_responses[] | .delegator_address as $addr | .entries[] | {delegator_address: $addr, creation_height, completion_time, balance: (.balance | tonumber / 1000000)}' | jq -r '(first | keys_unsorted) as $keys | $keys, map([.[$keys[]]])[] | @csv'

内容的提问来源于stack exchange,提问作者Erialos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 11:40:36