Проверьте порядок сортировки полей JSON - PullRequest
0 голосов
/ 26 декабря 2018

У меня есть следующие записи JSON, хранящиеся в контейнере

{"memberId":123,"memberCity":"Chicago","lastTransaction":1504155600000}
{"memberId":123,"memberCity":"Chigago","lastTransaction":150175600000}
{"memberId":123,"memberCity":"New York","lastTransaction":150195600000}

Я хочу проверить, что порядок сортировки, в котором хранятся эти записи, отсортирован по memberId ASC, memberCity ASC, lastTransaction ASC

Есть ли способ через jq, чтобы я мог утверждать (true / false) порядок сортировки, принимая во внимание несколько полей?

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Любое решение, которое требует использования параметра командной строки -s, имеет недостаток, заключающийся в том, что ему требуется больше памяти, чем необходимо.Точно так же использование sort в целом нецелесообразно, но если кто-то хочет получить краткое и простое решение, можно использовать:

jq -s 'map([.memberId, .memberCity, .lastTransaction]) | . == sort' 

или даже в конкретном конкретном случае:

jq -s 'map(.[]) | . == sort' 
0 голосов
/ 27 декабря 2018

Вот довольно эффективное решение, представленное таким образом, который, как мы надеемся, облегчает понимание и адаптацию:

def sorted:
  if length <= 1 then true
  else map([.memberId, .memberCity, .lastTransaction])
  | .[0] <= .[1]
  end;

def pairs(stream):
  foreach stream as $i ([]; 
    .[-1:] + [$i]; 
    select(length==2));


all(pairs(inputs); sorted)

Вызов:

jq -n -f sorted.jq input.json

Если звездывыровнены правильно, и вы хотите одну строку:

jq 'all(foreach [inputs[]] as $i ([[.[]]]; [.[-1],$i]); .[0]<=.[1])' input.json

Сезон по вкусу.

...