Можно ли применить рекурсивное преобразование к записи, чтобы вернуть ту же запись, но с отображением всех значений string?

Например:

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

С примененным отображением "добавить простое число":

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

Я пробовал использовать комбинацию recurse, map, string и select, но безуспешно. Есть идеи?

2
btiernay 24 Фев 2016 в 20:57

3 ответа

Лучший ответ

Вы также можете легко сделать это с помощью оператора рекурсии:

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

Если .. генерирует поток, рекурсивно перебирая каждый элемент ввода, strings фильтрует поток для тех, кто является строкой, += добавляет правый элемент к каждому элементу слева -ручный поток, а "\'" - это литерал, содержащий искомое "простое число".

3
user3899165user3899165 24 Фев 2016 в 22:30

Да, используйте walk/1. Это объясняется в руководстве по jq.

Если в вашем 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
peak 24 Фев 2016 в 18:20

Вот решение, которое использует пути / 1 для определения строковых значений и обновляет их с помощью reduce , setpath и getpath .

reduce paths(type == "string") as $p (
    .
  ; setpath($p; getpath($p) + "'")
)
0
jq170727 5 Авг 2017 в 01:46