【问题标题】:Split json into separate schema and data units将 json 拆分为单独的模式和数据单元
【发布时间】:2018-12-10 04:04:33
【问题描述】:

我想将一个 json 对象拆分成两个独立的单元

  • 持有架构的人
  • 保存数据或值(二进制压缩格式)。

编辑 - 为什么

我有一个带有 json api 的网络应用程序。我想要像 protobuf 这样的足迹,但像 json 那样无缝。我认为关于像 protobuf 或其他任何东西所需的对象的所有信息都已经在 json 对象中。

因此我想在运行时生成模式和数据并且只发送元组

(schema_hash, binary_compressed)

到服务器。如果服务器识别出 schema_hash,它可以将元组转换为内部对象并对其进行处理。否则,发送者可以重新发送 json,服务器将创建模式并缓存它。因此,您可以获得 protobuf 速度和 json 便利性。

它必须适用于所有 json 对象,而不仅仅是像下面这样的平面。

示例

{
    "variable_a": 1,
    "variable_b": 2
}

使用pythongenson我可以生成:

{
"$schema": "http://json-schema.org/schema#",
"type": "object",
"properties": {
    "variable_a": {
        "type": "integer"
    },
    "variable_b": {
        "type": "integer"
    }
},
"required": [
    "variable_a",
    "variable_b"
]

如何生成数据部分

在这种情况下应该只是两个整数,总共占用 2*32 位空间

【问题讨论】:

    标签: python json compression schema


    【解决方案1】:

    您可以将 json 视为字典。要对其进行迭代,您可以使用它:

    dic  = {
        "variable_a": 1,
        "variable_b": 2
    }
    

    要对其进行迭代,请使用如下代码:

    for key in dic:
        print(key, '-->', dic[key])
    

    但是,如果您有多个 json 数据记录,则可以将其保存在数据框对象中,前提是所有 json 对象中的属性都相同:

    columns = []
    for key in dic:
        columns.append(key)
    
    import pandas as pd
    df = pd.DataFrame(columns=columns)
    
    df.loc[len(df)]  = dic
    

    【讨论】:

    • 这是一个创造性的解决方案,但我希望该解决方案适用于独立的嵌套 json。不仅是多条记录平面 json 压缩。
    【解决方案2】:

    这能解决问题吗?

    obj = {
        "variable_a": 1,
        "variable_b": 2
    }
    # Get the values in the dictionary
    vals = obj.values()
    # Store the values as bytes
    vals_as_bytes = bytearray(vals)
    # Write the bytes to a binary file
    with open("filename", "wb") as file:
        file.write(vals_as_bytes)
    

    【讨论】:

    • 是的,这适用于我的示例中的平面 json,但不适用于嵌套 json。也不清楚如何反序列化。
    猜你喜欢
    • 1970-01-01
    • 2020-06-10
    • 2013-12-13
    • 2014-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多