通常,我想做这样的事情,它有效:
echo '{"a": 123, "b": "{\"embedded\": 456}", "c": 789}' | jq '{a, "b2": .b | fromjson, c}'
Run Code Online (Sandbox Code Playgroud)
有效并产生:
{
"a": 123,
"b2": {
"embedded": 456
},
"c": 789
}
Run Code Online (Sandbox Code Playgroud)
有时,字段“b”丢失,在这种情况下,上面的 jq 将出错:
echo '{"a": 123, "c": 789}' | jq '{a, "b2": .b | fromjson, c}'
Run Code Online (Sandbox Code Playgroud)
这给出了一个 null 错误,这是有道理的,因为 b 缺失,所以.bnull 和fromjsonnull 上的错误。我想编写我的jq命令,以便如果b缺少记录,则不会输出它。我想简单地得到这个:
{
"a": 123,
"c": 789
}
Run Code Online (Sandbox Code Playgroud)
我浏览了jq参考手册。我无法使用 if/else/end 结构来解决这个问题。我没有看到任何其他可用的空处理函数或语言结构。
有几种可能的方法,每种方法都有变体。以下是一种建设性方法和后处理方法的说明。
{a} + ((select(has("b")) | {"b2": .b | fromjson}) // {}) + {c}
Run Code Online (Sandbox Code Playgroud)
或者更简洁但语义略有不同:
[{a}, (select(.b) | {b2: .b | fromjson}), {c}] | add
Run Code Online (Sandbox Code Playgroud)
{a, "b2": (.b | fromjson? // null), c}
| if .b2 == null then del(.b2) else . end
Run Code Online (Sandbox Code Playgroud)
你需要像下面这样的东西。使用 if 条件检查.bto be是否存在null。当不为空时,形成具有所有字段的结构。
jq 'if .b != null then { a, "b2":(.b|fromjson), c } else {a, c} end'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2657 次 |
| 最近记录: |