如何使用jq

时间:2016-02-24 17:57:07

标签: json recursion jq

是否可以对记录应用递归转换以返回相同的记录,但是映射了所有string个值?

例如:

{"x":"1", "a": {"b": 2, "c": ["a"]}, "d": {"e": "z"}}

应用了“添加素数”的映射:

{"x":"1'", "a": {"b": 2, "c": ["a'"]}, "d": {"e": "z'"}}

我尝试使用recursemapstringselect的组合运气不佳。有什么想法吗?

3 个答案:

答案 0 :(得分:3)

您也可以使用recurse运算符轻松完成此操作:

jq '(.. | strings) += "\'"'

..通过递归迭代输入的每个元素生成流,strings过滤流的字符串,+=将右侧元素添加到每个元素在左侧流中,"\'"是包含您寻找的“素数”的文字。

答案 1 :(得分:2)

是的,请使用walk/1。它在jq manual中解释。

如果你的jq没有定义它,那么它的定义来自builtin.jq

# Apply f to composite entities recursively, and to atoms
def walk(f):
  . as $in
  | if type == "object" then
      reduce keys[] as $key
        ( {}; . + { ($key):  ($in[$key] | walk(f)) } ) | f
  elif type == "array" then map( walk(f) ) | f
  else f
  end;

答案 2 :(得分:0)

以下是使用路径/ 1 标识字符串值并使用 reduce setpath getpath <更新字符串值的解决方案/强>

reduce paths(type == "string") as $p (
    .
  ; setpath($p; getpath($p) + "'")
)