通常,我想做这样的事情,它可以工作:
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构造来解决此问题时遇到了麻烦。我看不到其他可用的空处理函数或语言构造。
答案 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'