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

如何使用jq将嵌套JSON的多消息数组转换为按id排序的单数组?

使用JQ转换JSON结构的纯JQ解决方案

需求概述

将原JSON中_internal_messages下的error、info、success三个数组合并为单一数组,为每条消息添加type字段标识原类型,并最终按id字段升序排列。

原JSON结构

{
  "_internal_messages": {
    "error": [
      {
        "date": "16:12:30 - 07/02/2023",
        "id": 1,
        "origin": "A",
        "text": "This is an error message"
      },
      {
        "date": "16:12:31 - 07/02/2023",
        "id": 5,
        "origin": "A",
        "text": "This is a second error message"
      }
    ],
    "info": [
      {
        "date": "16:12:29 - 07/02/2023",
        "id": 0,
        "origin": "A",
        "text": "This is an info message"
      },
      {
        "date": "16:12:30 - 07/02/2023",
        "id": 4,
        "origin": "C",
        "text": "This is a second info message"
      }
    ],
    "success": [
      {
        "date": "16:12:30 - 07/02/2023",
        "id": 2,
        "origin": "B",
        "text": "This is a success message"
      },
      {
        "date": "16:12:30 - 07/02/2023",
        "id": 3,
        "origin": "B",
        "text": "This is a second success message"
      },
      {
        "date": "16:12:31 - 07/02/2023",
        "id": 6,
        "origin": "C",
        "text": "This is a third success message"
      }
    ]
  }
}

目标JSON结构

{"_internal_messages":[
  {
    "type":"info",
    "date": "16:12:29 - 07/02/2023",
    "id": 0,
    "origin": "A",
    "text": "This is an info message"
  },{
    "type":"error",
    "date": "16:12:30 - 07/02/2023",
    "id": 1,
    "origin": "A",
    "text": "This is an error message"
  },{
    "type":"success",
    "date": "16:12:30 - 07/02/2023",
    "id": 2,
    "origin": "B",
    "text": "This is a success message"
  },{
    "type":"success",
    "date": "16:12:30 - 07/02/2023",
    "id": 3,
    "origin": "B",
    "text": "This is a second success message"
  },{
    "type":"info",
    "date": "16:12:30 - 07/02/2023",
    "id": 4,
    "origin": "C",
    "text": "This is a second info message"
  },{
    "type":"error",
    "date": "16:12:31 - 07/02/2023",
    "id": 5,
    "origin": "A",
    "text": "This is a second error message"
  },{
    "type":"success",
    "date": "16:12:31 - 07/02/2023",
    "id": 6,
    "origin": "C",
    "text": "This is a third success message"
  }
]}

纯JQ处理命令

jq '{_internal_messages: [._internal_messages | to_entries[] | .value[] + {type: .key}] | sort_by(.id)}'

命令分步解释

  • ._internal_messages | to_entries[]:把原_internal_messages下的error/info/success键值对转换为{key: "类型名", value: 对应数组}的结构,遍历所有键值对
  • .value[] + {type: .key}:遍历每个类型数组里的消息对象,为每个对象新增type字段,字段值就是原类型名
  • [...]:将所有处理后的消息对象整合为一个数组
  • | sort_by(.id):对这个数组按id字段从小到大排序
  • {_internal_messages: ...}:把排序后的数组包装成最终的JSON结构,保持顶层键名不变

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 23:42:51