jq JSON处理缺少的字段

时间:2019-07-17 06:42:17

标签: json jq

通常,我想做这样的事情,它可以工作:

echo '{"a": 123, "b": "{\"embedded\": 456}", "c": 789}' | jq '. | {a, "b2": .b | fromjson, c}' 

有效并产生效果:

{
  "a": 123,
  "b2": {
    "embedded": 456
  },
  "c": 789
}

有时,字段“ b”丢失,在这种情况下,上面的jq将出错:

echo '{"a": 123, "c": 789}' | jq '. | {a, "b2": .b | fromjson, c}'

这将导致空错误,这是有道理的,因为b缺失,因此.b为空,而fromjson为null时发生错误。我想编写我的jq命令,因此如果记录中缺少b,则不会输出。我只想得到这个:

{
  "a": 123,
  "c": 789
}

我已经浏览了jq参考手册。我在获取if / else / end构造来解决此问题时遇到了麻烦。我看不到其他可用的空处理函数或语言构造。

3 个答案:

答案 0 :(得分:2)

有几种可能的方法,每种方法都有变体。这是一种建设性方法和后处理方法的说明。

建设性

{a} + ((select(has("b")) | {"b2": .b | fromjson}) // {}) + {c}

或更简洁,但语义略有不同:

[{a}, (select(.b) | {b2: .b | fromjson}), {c}] | add

后处理

{a, "b2": (.b | fromjson? // null), c}
| if .b2 == null then del(.b2) else . end

答案 1 :(得分:1)

您需要以下类似的内容。使用if条件检查.b是否存在null。形成结构,使其在不为null时具有所有字段。

jq 'if .b != null then { a, "b2":(.b|fromjson), c } else {a, c} end'

答案 2 :(得分:0)

这是最好的方法,结合了Peak和Inian的答案中的建议:

# example with b
echo '{"a": 123, "b": "{\"embedded\": 456}", "c": 789}' | jq '{a, c} + if has("b") then {"b": .b | fromjson} else {} end'

# example without b
echo '{"a": 123, "not_b": "{\"embedded\": 456}", "c": 789}' | jq '{a, c} + if has("b") then {"b": .b | fromjson} else {} end'