KDB: как разобрать файл json? - PullRequest
0 голосов
/ 31 октября 2018

Я создал файл конфигурации в формате JSON и хочу использовать KDB для его чтения в качестве словаря.

В Python это так просто:

with open('data.json') as f:
    data = json.load(f)

Есть ли подобная функция в KDB?

Ответы [ 3 ]

0 голосов
/ 31 октября 2018

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

Для кодирования таблицы kdb в JSON необходимо отправить массив объектов с одинаковыми ключами. KDB также будет кодировать таблицы как массивы объектов в JSON.

q).j.k "[{\"a\":1,\"b\":2},{\"a\":3,\"b\":4}]"
a b
---
1 2
3 4

При кодировании q будет использоваться значение \P для выбора точности, которая по умолчанию равна 7, что может привести к нежелательному округлению.

Это может быть изменено на 0, что означает максимальную точность, хотя последние цифры ненадежны, как показано ниже. Смотрите здесь для получения дополнительной информации https://code.kx.com/q/ref/cmdline/#-p-display-precision.

q).j.j 1.000001 1.0000001f
"[1.000001,1]"

q)\P 0
q).j.j 1.000001 1.0000001f
"[1.0000009999999999,1.0000001000000001]"
0 голосов
/ 31 октября 2018

Чтобы прочитать ваш JSON-файл в kdb +, вы должны использовать read0. Это возвращает строки файла в виде списка строк.

q)read0`:sample.json
,"{"
"\"name\":\"John\","
"\"age\":30,"
"\"cars\":[ \"Ford\", \"BMW\", \"Fiat\" ]"
,"}"

kdb + позволяет десериализацию (и сериализацию) объектов JSON в словари с использованием пространства имен .j. Встроенный .j.k ожидает одну строку символов, содержащую json, и преобразует ее в словарь. raze должен использоваться, чтобы сгладить наш список строк:

q)raze read0`:sample.json
"{\"name\":\"John\",\"age\":30,\"cars\":[ \"Ford\", \"BMW\", \"Fiat\" ]}"

Наконец, использование .j.k в этой строке дает словарь

q).j.k raze read0`:sample.json
name| "John"
age | 30f
cars| ("Ford";"BMW";"Fiat")

Для особенно большого файла JSON может быть более эффективно использовать read1 вместо raze read0 в вашем файле, например.

q).j.k read1`:sample.json
name| "John"
age | 30f
cars| ("Ford";"BMW";"Fiat")

Если вас интересует обратная операция, вы можете использовать .j.j для преобразования словаря в список строк и использовать 0: для сохранения.

Дополнительную информацию о пространстве имен .j можно найти здесь . Вы также можете увидеть больше примеров на вики Kx read0 , read1 и 0: .

0 голосов
/ 31 октября 2018

Работа с JSON обрабатывается пространством имен .j, где .j.j сериализует и .j.k десериализует сообщения. Обратите внимание, что сначала вам нужно будет использовать raze для преобразования JSON в одну строку.

Более подробная информация доступна на Kx wiki , где представлен следующий пример:

q).j.k "{\"a\":[0,1],\"b\":[\"hello\",\"world\"]}"
a| 0       1
b| "hello" "world"
...