【问题标题】:jq: error (at <stdin>:125): Cannot index array with string "DefId"jq:错误(在 <stdin>:125):无法使用字符串“DefId”索引数组
【发布时间】:2021-12-18 18:30:35
【问题描述】:

我有以下 json 数据。在解析它时需要帮助。

{
  "e4624072-a9a2-4181-9649-550b9cfeb7cd||220000d7f738801": {
    "List": [
      {
        "Insts": [
          {
            "DefId": "A1",
            "data1": 1073741824,
            "data2": 0,
            "data3": 0
          }
        ]
      }
    ],
    "name": [
      "AMIT||220000d7f728801"
    ],
    "id": "e4624072-a9a2-4181-9649-550b9cfeb7cd||220000d7f738801",
    "endTime": 96285337200000
  },
  "0b1141b2-c2de-47c9-aa0c-2742f92b63f2||220000d7f738801": {
    "List": [
      {
        "Insts": [
          {
            "DefId": "B1",
            "data1": 5368709120,
            "data2": 5368709120,
            "data3": 5368709120
          }
        ]
      },
      {
        "edigest": "MV6shIv5NE5vWkc0cx6Q/JTwid4=",
        "csDefRef": "BoostYES_B1"
      },
      {
        "edigest": "MV6shIv5NE5vWkc0cx6Q/JTwid4=",
        "csDefRef": "BoostOff_B1"
      }
    ],
    "name": [
      "AMIT||220000d7f728801"
    ],
    "id": "0b1141b2-c2de-47c9-aa0c-2742f92b63f2||220000d7f738801",
    "lifeCycle": 0
  },
  "23e529f9-b2f3-4730-9b28-4ee05ca678b6||220000d7f738801": {
    "List": [
      {
        "Insts": [
          {
            "DefId": "A2",
            "data1": 1073741824,
            "data2": 0,
            "data3": 0,
            "lastUpdateTime": 1619541451476,
            "origInitialVal": 1073741824
          }
        ]
      }
    ],
    "name": [
      "AMIT||220000d7f728802"
    ],
    "id": "23e529f9-b2f3-4730-9b28-4ee05ca678b6||220000d7f738801",
    "endTime": 96285337200000,
    "lifeCycle": 0
  },
  "66b2229b-2c16-4d54-b2a8-fcc1baeaf51c||220000d7f738801": {
    "List": [
      {
        "Insts": [
          {
            "DefId": "B2",
            "data1": 10737418240,
            "data2": 10737418240,
            "data3": 10737418240,
            "lastUpdateTime": 1637766239807,
            "origInitialVal": 10737418240
          }
        ]
      },
      {
        "edigest": "MV6shIv5NE5vWkc0cx6Q/JTwid4=",
        "csDefRef": "RMN_B2"
      }
    ],
    "name": [
      "AMIT||220000d7f728801"
    ],
    "startTime": 1637766000000,
    "id": "66b2229b-2c16-4d54-b2a8-fcc1baeaf51c||220000d7f738801",
    "endTime": 1637852400000,
    "lifeCycle": 0
  },
  "b896eb1b-d6b0-432b-8925-af17431c0f3e||220000d7f738801": {
    "List": [
      {
        "Insts": [
          {
            "DefId": "B3",
            "data1": 2147483648,
            "data2": 2147483648,
            "data3": 2147483648,
            "lastUpdateTime": 1635692405780
          }
        ]
      },
      {
        "edigest": "MV6shIv5NE5vWkc0cx6Q/JTwid4=",
        "csDefRef": "BoostYES_B3"
      },
      {
        "edigest": "MV6shIv5NE5vWkc0cx6Q/JTwid4=",
        "csDefRef": "BoostOffCS_B3"
      }
    ],
    "name": [
      "AMIT||220000d7f728801"
    ],
    "id": "b896eb1b-d6b0-432b-8925-af17431c0f3e||220000d7f738801",
    "lifeCycle": 0
  }
}

需要的输出如下:

AMIT||220000d7f728801,A1,1073741824,0,0
AMIT||220000d7f728801,B1,5368709120,5368709120,5368709120
AMIT||220000d7f728801,A2,1073741824,0,0
AMIT||220000d7f728801,B2,10737418240,10737418240,10737418240
AMIT||220000d7f728801,B3,2147483648,2147483648,2147483648

我尝试在 jq 下面开始执行,但它给出了标题中提到的。这可能是因为 DefId 并非在所有地方都存在。数据 1、数据 2 和数据 3 也是如此。

jq -r '.[] | ."name", ."List"[]."Insts"."DefId"'

为了得到正确的输出,正确的 jq 命令是什么?

【问题讨论】:

  • Insts 是一个字典列表。我认为你没有考虑到这一点。

标签: json jq


【解决方案1】:

不幸的是,您对数据结构的约束(保证存在的字段、数组的长度等)只字未提。因此,只需根据您提供的内容,这会将内容提取为您想要的输出格式:

jq -r '.[] | [.name[0] , (.List[0].Insts[0] | .DefId, .data1, .data2, .data3)] | join(",")' 
AMIT||220000d7f728801,A1,1073741824,0,0
AMIT||220000d7f728801,B1,5368709120,5368709120,5368709120
AMIT||220000d7f728801,A2,1073741824,0,0
AMIT||220000d7f728801,B2,10737418240,10737418240,10737418240
AMIT||220000d7f728801,B3,2147483648,2147483648,2147483648

Demo

【讨论】:

    【解决方案2】:

    您可以通过使用

    List.Insts数组内动态行走而不会出错

    .List[].Insts | select( . != null ) 用于 to_entries[]

    的返回值

    虽然提取 name 键的值很简单。

    然后加入通过使用包装方括号,如

    jq -r 'to_entries[] | .value | [ .name[] , (.List[].Insts | select( . != null ) | .[] | .DefId, "\(.data1)", "\(.data2)", "\(.data3)" ) ]  | join(",")'
    

    Demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-30
      • 1970-01-01
      • 2016-04-05
      • 1970-01-01
      • 2018-01-14
      • 2021-03-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多