【问题标题】:KDB: How to parse a json file?KDB:如何解析 json 文件?
【发布时间】:2018-10-31 17:53:04
【问题描述】:

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

在 Python 中,这很简单:

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

KDB有类似的功能吗?

【问题讨论】:

    标签: json parsing dictionary kdb


    【解决方案1】:

    要将您的 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。 您还可以在 read0read10: 的 Kx wiki 上查看更多示例。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-02-14
          • 1970-01-01
          • 2018-04-07
          • 2016-06-19
          • 1970-01-01
          相关资源
          最近更新 更多