JSONata: метод или функция для тестирования типа данных значения JSON.

avatar
Michael Howard
7 апреля 2018 в 22:20
1762
4
3

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

Однако мне не удалось найти способ проверить тип данных значения JSON.

Например, для массива:

    [null, true, false, 1, 2.3, "a", ["x"], {}, {"y" : "z}]

Я хочу вывести только числовые значения.

    [1, 2.3]

В. Как в запросе JSONata проверить тип данных JSON (нулевой, логический, числовой, строковый, массив, объект) значения?

Источник

Ответы (4)

avatar
John P
17 февраля 2020 в 12:01
2

JSONata предлагает метод $type для проверки типа данных значения JSON. Например. следующий фрагмент вернет типы данных значений в примерах данных счетов в https://try.jsonata.org.

Account.Order.Product.{
    "priceType": $type(Price),
    "productNameType": $type($.'Product Name'),
    "descriptionType": $type(Description)
}

Результат:

[
  {
    "priceType": "number",
    "productNameType": "string",
    "descriptionType": "object"
  },
  {
    "priceType": "number",
    "productNameType": "string",
    "descriptionType": "object"
  },
  {
    "priceType": "number",
    "productNameType": "string",
    "descriptionType": "object"
  },
  {
    "priceType": "number",
    "productNameType": "string",
    "descriptionType": "object"
  }
]

Изменив значения Price и Product Name на null в примере JSON, результат для этого конкретного объекта изменится на:

{
    "priceType": "null",
    "productNameType": "null",
    "descriptionType": "object"
},

Можно проверить 'null', 'number', 'string', 'array', 'object', 'boolean'.

Что касается меня, я использовал его для проверки нулевых значений при преобразовании дат в миллисекунды:

'enddate': $type($v.enddate) = 'null' ? null : $toMillis($v.enddate),
avatar
Victor Sembelidis
22 апреля 2019 в 09:09
2

Вау, сегодня обнаружил эту классную JSONata. Вот моя попытка:

http://try.jsonata.org/

 [null, true, false, 1, 2.3, "a", ["x"], {}, {"y" : "z"}]
*[$ ~> /^[0-9\.]{1,}$/m]
avatar
gmag11
28 января 2019 в 07:10
0

Вы можете проверить, является ли значение числом, выполнив value - value = 0. Если типом является число, оно всегда будет равно 0, поэтому результатом будет true. Это вызовет ошибку, если это строка.

ShadowGames
27 ноября 2020 в 20:19
0

Представьте себе систему, которая выполняет эту проверку тысячи раз в минуту и ​​создает запись в журнале об этой ошибке. Хмм. Это может легко спамить файлы журналов.

avatar
Andrew Coleman
18 апреля 2018 в 13:22
2

В настоящее время это невозможно сделать в JSONata. Тем не менее, достойный запрос на улучшение.