Как выполнять обновления объектов JSON с помощью утилиты командной строки jq

#javascript #json #shell #jq

#javascript #json #оболочка #jq

Вопрос:

У меня есть объект JSON следующим образом

{«Образец»: [{ «ключ»: «Ключевое имя», «значения»: [ [1025409600000, 10], [1028088000000, -6.3382185140371] ] }]}

Используя javascript, я могу изменять любые значения следующим образом

 data.Sample[0].values.push([1028088000000,0]);
  

Как выполнить аналогичную операцию с помощью json-процессора командной строки jq? Таким образом, объект JSON становится

{«Образец»: [{ «ключ»: «Ключевое имя», «значения»: [ [1025409600000, 10], [1028088000000, 0] ] }]}

Спасибо.

Комментарии:

1. итак, каков ожидаемый результат? 1028088000000 заменяется на 0?

2. Спасибо за ваш ответ. Таким образом, объект JSON становится {«Sample» : [{ «key»: «keyName», «values»: [ [1025409600000, 10], [1028088000000, 0] ] }]}

Ответ №1:

В нынешнем виде в вопросе есть ошибка, поскольку Array.push Javascript добавляется к массиву.

Эквивалент jq данного выражения:

 data.Sample[0].values.push([1028088000000,0]);
  

было бы:

 .Sample[0].values  = [[1028088000000,0]]
  

или, если вы хотите использовать синтаксис Javascript, вы могли бы определить def push(x): .[length] = x;

Если вы хотите заменить последнее значение в values массиве другим значением, скажем, $ x, вы можете (используя jq 1.5 или более позднюю версию) написать:

 .Sample[0].values[-1] = $x
  

Более надежный (в отношении различных выпусков jq) подход будет:

 .Sample[0].values |= (.[length-1] = $x)
  

В jq 1.5 или более поздней версии, если вы хотите только изменить отрицательное число на 0, вы должны написать:

     .Sample[0].values[-1][-1] = 0
  

И т.д.