KDB:如何解析json文件?

时间:2018-10-31 17:53:05

标签: json parsing dictionary kdb

我以JSON格式创建了一个配置文件,我想使用KDB来将其作为字典读取。

在Python中,这非常简单:

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

KDB中是否有类似的功能?

3 个答案:

答案 0 :(得分:5)

要将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:保存。

可以在here上找到有关.j命名空间的更多信息。 您还可以在read0read10:的Kx Wiki上看到更多示例。

答案 1 :(得分:4)

使用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"

答案 2 :(得分:2)

在使用.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]"