【发布时间】:2018-10-31 17:53:04
【问题描述】:
我创建了一个 JSON 格式的配置文件,我想使用 KDB 将其作为字典读取。
在 Python 中,这很简单:
with open('data.json') as f:
data = json.load(f)
KDB有类似的功能吗?
【问题讨论】:
标签: json parsing dictionary kdb
我创建了一个 JSON 格式的配置文件,我想使用 KDB 将其作为字典读取。
在 Python 中,这很简单:
with open('data.json') as f:
data = json.load(f)
KDB有类似的功能吗?
【问题讨论】:
标签: json parsing dictionary kdb
要将您的 JSON 文件读入 kdb+,您应该使用 read0。这会将文件的行作为字符串列表返回。
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:保存。
有关.j 命名空间的更多信息,请访问here。
您还可以在 read0、read1 和 0: 的 Kx wiki 上查看更多示例。
【讨论】:
使用 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 表,应发送具有相同键的对象数组。 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]"
【讨论】: