как выбрать объекты JSON между заданными датами - PullRequest
2 голосов
/ 11 марта 2019

Ниже приведен ответ json API. Необходимо получить обменный курс из JSON с помощью JQ (в сценарии оболочки). Ниже приведены условия: начальная дата должна быть равна текущей дате или превышать ее, а конечная дата должна быть равна или меньше текущей даты для данной валюты от и до валюты.

[
    {
        "status": "ACTIVE",
        "startdate": "2019-01-31T00:00:00.000Z",
        "enddate": "2019-02-07T00:00:00.000Z",
        "source": "default",
        "exchangerate": "12",
        "currencyfrom": "AUD",
        "currencyto": "BRL",
        "id": "64ce2916-af8a-42b9-9fb9-def47f824ea2"
    },
    {
        "status": "ACTIVE",
        "startdate": "2019-03-10T00:00:00.000Z",
        "enddate": "2019-03-30T00:00:00.000Z",
        "source": "default",
        "exchangerate": "13",
        "currencyfrom": "BRL",
        "currencyto": "GBP",
        "id": "4fd0dc10-d6b7-4298-924d-281a0d49c2e9"
    },
    {
        "status": "ACTIVE",
        "startdate": "2019-03-10T00:00:00.000Z",
        "enddate": "2019-03-10T16:20:10.813Z",
        "source": "default",
        "exchangerate": "17",
        "currencyfrom": "AUD",
        "currencyto": "BRL",
        "id": "52bfe481-f4cf-4822-9566-886c4faeaf10"
    }
]

1 Ответ

1 голос
/ 11 марта 2019

Игнорируя соображения о часовом поясе, вы можете использовать следующую вспомогательную функцию в качестве основного строительного блока для сравнения времени:

def secs: sub("\\....(?<z>.)$"; .z) | fromdate;

С его помощью вы можете выбирать объекты JSON в массиве, сохраняя структуру массива следующим образом:

now as $now
| map(select(.startdate|secs) <= $now and $now <= (.enddate|secs)) )

Это не совсем соответствует вашему описанию, но имеет смысл.

Как только объекты выбраны, вы можете извлечь интересующие поля обычным способом.

...