javascript - 是否有任何库可以为 JSON 数据生成元组和重构字符串?

标签 javascript python json

我想问一下是否有一个库可以拆分 JSON 字符串的“列”和“数据”。

目标:

我需要减少在我们开发的遥测系统中传输的数据量。

在幕后,字符串化的 json 数据被交换。如果我能够将“列”和“数据”分成不同的部分,我将只交换“列”一次,那么“数据”将占用更少的带宽:

orig_data = {"hello": 1, "how_are_you": "good"}
template = "{\"hello\": %d, \"how_are_you\": \"%s\"}"
data = (1, "good")

reconstructed_data = json.loads(template % data) 

template 只会交换一次,这样data 的发送效率会更高。

一个更有效的例子将在数字输入/输出交换中显示:

orig_data = {"heater_1_started": True, "heater_2_started": False, ..., "heater_76_started": False, "motor_1_running": False, ...}

会变成

data = [0x0345]

那么,是否有任何库可以获取 JSON 数据并根据该信息生成 template

编辑

最后,我想要一个自适应协议(protocol):

protocol_signature = crc32(template)
if protocol_signature not in synchronized_protocol_signatures: 
    send({'protocol': [protocol_signature, template]})
send([protocol_signature, data])

最佳答案

如果字段始终以相同的顺序发送,您可以使用 namedtuple .使用您的列名称创建一个 namedtuple,然后只需发送数据值并实例化您的 namedtuple 类的副本。

from collections import namedtuple
import json

# Initial column names (send only once)
column_names = ['x', 'y', 'z']

MyData = namedtuple('MyData', column_names)

json_string_from_server = '[True, 1, "good"]'
json_data = json.loads(json_string_from_server)

data = MyData(*json_data)

print data.x, data.y, data.z
# True 1 "good"

就压缩发送的数据而言,这取决于您发送的数据类型。如果它主要是任意长度的字符串和整数,则字符串化的 json 可能已经尽可能地压缩了。

如果您想压缩成单个位的主要是开/关 bool 标志,则可以使用像 bitarray 这样的库.

>>> from bitarray import bitarray
>>> a = bitarray()            # create empty bitarray
>>> a.append(True)
>>> a.extend([False, True, True])
>>> a
bitarray('1011')

关于javascript - 是否有任何库可以为 JSON 数据生成元组和重构字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35143175/

相关文章:

python - 生成随机 IPv6 地址

json - Grails JSON编码

jquery - data.map 不是函数

javascript - 如何告诉 Vue 应用使用 Firebase 模拟器?

JavaScript 单元测试 : Cannot check if jQuery method was called

javascript - 将 php 数组导入 javascript 数据集

python - 为什么我的numpy文件比使用同一数组生成的PNG大?

Python - 重用相同的字典,同时仅更改提供值的对象

ruby - 如何使用 Ruby 的 JSON gem 深入了解 JSON 对象

javascript - Kendo Grid,如何在按下 Tab 键的下一个可编辑列上启用编辑?