【问题标题】:jq: error (at ec-state:1028): Cannot iterate over null (null)jq:错误(在 ec-state:1028):无法迭代 null(null)
【发布时间】:2019-08-04 17:02:14
【问题描述】:

我有一个冗长的 JSON 文件,我执行命令得到如下所示的输出:

jq -s '.[]
  | ."lrouter/show"[]
  |  del( . | select(.type == "TUNNEL-VRF"))
  | del(.ports[] | select(.type == "blackhole" or .type == "cpu-port" or .type == "loopback"))
  | "Name: \(.name)" ,
    "UUID: \(.uuid)" ,
   (.ports[] | {Port_Name: .name,
                Port_Type: .type, 
                Port_Peer: .peer,
                Port_IPs: .ips[],
                Port_Admin_Up: .admin_up, 
                Port_Op_State: .op_state_up } )' ec-state

"Name: SR-t0-uplink"
"UUID: 23354d26-6994-46d9-b78c-bb565a1c13f2"
{
  "Port_Name": "uplink",
  "Port_Type": "uplink",
  "Port_Peer": "d78089f6-71b5-4c8e-a477-69ee01f17c5c",
  "Port_IPs": "1.1.13.5/24",
  "Port_Admin_Up": true,
  "Port_Op_State": true
}
{
  "Port_Name": "bp-sr0-port",
  "Port_Type": "backplane",
  "Port_Peer": null,
  "Port_IPs": "169.254.0.2/28",
  "Port_Admin_Up": false,
  "Port_Op_State": false
}
jq: error (at ec-state:1028): Cannot iterate over null (null)

我得到了想要的结果,但是在结果的末尾我也得到了 jq 错误。只是想知道我在查询中做错了什么。

【问题讨论】:

  • 请分享您的 json(或足够的 json 部分)以重现该问题。

标签: json debugging bigdata jq


【解决方案1】:

由于您的输入很大,您可能会考虑添加断言或等效项。由于您的程序显然在各个点都需要数组,因此您可以使用以下函数对其进行检测:

def q($n; $msg):
  if type == "array" or type == "object" 
  then .
  else error("\($msg): composite expected @ \($n) vs \(.)")
  end;

然后您的程序可以按如下方式检测:

range(0;length) as $n
  | .[$n]
  | ."lrouter/show" | q($n; 2) | .[]
  | del( . | select(.type == "TUNNEL-VRF"))
  | del(.ports | q($n; 3) | .[] | select(.type == "blackhole" or .type == "cpu-port" or .type == "loopback"))
  | "Name: \(.name)" ,
    "UUID: \(.uuid)" ,
   (.ports[] | {Port_Name: .name,
                Port_Type: .type, 
                Port_Peer: .peer,
                Port_IPs: (.ips | q($n; 4) |.[]),
                Port_Admin_Up: .admin_up, 
                Port_Op_State: .op_state_up } )

【讨论】:

  • 你能解释一下你的逻辑吗?我理解了 def 部分。我不明白如何使用值 2 和值 4?
  • 它们只是故障点的指示器,以帮助查明问题。
猜你喜欢
  • 2019-09-14
  • 2019-07-14
  • 2015-03-28
  • 2019-06-08
  • 2020-12-21
  • 1970-01-01
  • 1970-01-01
  • 2015-01-12
  • 2021-04-27
相关资源
最近更新 更多