2015-08-07 3 views
1

У меня есть большой JSON-файл, где я хотел бы преобразовать некоторые значения на основе какого-то отображения.Карта значений с JQ

Данные у меня есть выглядит следующим образом:

[ 
    {"id":1, "value":"yes"}, 
    {"id":2, "value":"no"}, 
    {"id":3, "value":"maybe"} 
] 

И я хотел бы, чтобы преобразовать это в список, как это:

[ 
    {"id":1, "value":"10"}, 
    {"id":2, "value":"0"}, 
    {"id":3, "value":"5"} 
] 

С фиксированным отображением:

yes => 10 
no => 0 
maybe => 5 

Мое текущее решение основано на простой комбинации if-elif-else следующим образом:

cat data.json| jq '.data[] | .value = (if .value == "yes" then "10" elif .value == "maybe" then "5" else "0" end)' 

Но это действительно уродливо, и я хотел бы иметь более прямой способ выразить отображение.

Спасибо за вашу помощь

ответ

1

Если кто-то хочет, чтобы избежать необходимости указывать отображение в командной строке, то следующие два варианта может быть интересно.

Первый вариант может быть использован с JQ 1.3, 1.4 и JQ JQ 1.5:

def mapping: {"yes":"10","no":"0","maybe":"5"}; 
map(.value |= mapping[.]) 

Следующий вариант использует --argfile вариант (выпускается с JQ 1.4), и представляет интерес, если отображение объект доступен в файле:

jq --argfile mapping mapping.jq 'map(.value |= $mapping[.])' data.json 

Наконец, в JQ 1.5, другие варианты на основе импорта также доступны (!).

1

Поскольку вы переводите строковые значения, вы должны быть в состоянии использовать объект JSON для хранения отображений. Тогда отображение было бы тривиальным.

$ jq --arg mapping '{"yes":"10","no":"0","maybe":"5"}' 
    'map(.value |= ($mapping | fromjson)[.])' data.json 
+0

Заметим, что , в последних сборках jq вы можете использовать '--argjson' вместо' --arg', чтобы опустить '| fromjson' в скрипте. –

0

Вот решение, которое использует «встроенный» объект, так как отображение мала:

map(.value = {"yes":"10","no":"0","maybe":"5"}[.value]) 

, которые могут быть замкнуты с |= как в растворе peak «ы к:

map(.value |= {"yes":"10","no":"0","maybe":"5"}[.]) 
Смежные вопросы