KDB:如何解析 json 文件?
KDB: How to parse a json file?
我创建了一个 JSON 格式的配置文件,我想使用 KDB 将其作为字典读入。
在Python,就是这么简单:
with open('data.json') as f:
data = json.load(f)
KDB有没有类似的功能?
使用 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"
当使用 .j.j
时,kdb 中的符号和字符串都将被编码为 JSON 字符串,而 kdb 会将 JSON 字符串解码为 kdb 字符串,但键除外,它们将是符号。
要在 JSON 中对 kdb table 进行编码,应发送具有相同键的对象数组。 kdb 还将 tables 编码为 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]"
要将 JSON 文件读入 kdb+,您应该使用 read0
。 returns 文件的行作为字符串列表。
q)read0`:sample.json
,"{"
"\"name\":\"John\","
"\"age\":30,"
"\"cars\":[ \"Ford\", \"BMW\", \"Fiat\" ]"
,"}"
kdb+ 允许使用 .j
命名空间将 JSON 对象反序列化(和序列化)到字典。内置的 .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:
保存。
的 Kx wiki 上查看更多示例
我创建了一个 JSON 格式的配置文件,我想使用 KDB 将其作为字典读入。
在Python,就是这么简单:
with open('data.json') as f:
data = json.load(f)
KDB有没有类似的功能?
使用 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"
当使用 .j.j
时,kdb 中的符号和字符串都将被编码为 JSON 字符串,而 kdb 会将 JSON 字符串解码为 kdb 字符串,但键除外,它们将是符号。
要在 JSON 中对 kdb table 进行编码,应发送具有相同键的对象数组。 kdb 还将 tables 编码为 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]"
要将 JSON 文件读入 kdb+,您应该使用 read0
。 returns 文件的行作为字符串列表。
q)read0`:sample.json
,"{"
"\"name\":\"John\","
"\"age\":30,"
"\"cars\":[ \"Ford\", \"BMW\", \"Fiat\" ]"
,"}"
kdb+ 允许使用 .j
命名空间将 JSON 对象反序列化(和序列化)到字典。内置的 .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:
保存。