相关疑难解决方法(0)

python 3 不会在 msgpack 的 dict 中找到键

为什么会在python3中发生这种情况?

1)我从redis获取msgpack数据

2)我打开我得到以下

3)返回的类型是一个字典:

meta = msgpack.unpackb(data[1])
print(type(meta))
<class 'dict'>

 meta = {b'api_key': b'apikey1',
        b'sensor_id': b'sid1',
        b'version': b'1.0'}
Run Code Online (Sandbox Code Playgroud)

如果我运行以下命令:sensor_meta['sensor_id']

{b'api_key': b'apikey1',
 b'sensor_id': b'sid1',
 b'version': b'1.0'}
Traceback (most recent call last):
  File "/Users//worker.py", line 247, in <module>
    print(meta['sensor_id'])
KeyError: 'sensor_id'
Run Code Online (Sandbox Code Playgroud)

但是如果我使用 sensor_meta[b'sensor_id'] 那么它就可以了。

什么是“b”,我怎样才能摆脱它?如何转换整个对象以便没有 b ?

所以如果我执行以下操作:

   print(type(meta['sensor_id']))
   <class 'bytes'>
Run Code Online (Sandbox Code Playgroud)

为什么是字节以及它是如何到达那里的?每次我想在散列中使用键时,我都不会附加 ab。

谢谢

python-3.x msgpack

6
推荐指数
1
解决办法
1490
查看次数

msgpack反序列化dict密钥字符串转换为字节

msgpack在python中遇到问题。似乎在序列化a时dict,如果键是字符串str,则它们不会正确地反序列化并导致引发KeyError异常。

例:

>>> import msgpack
>>> d = dict()
>>> value = 1234
>>> d['key'] = value
>>> binary = msgpack.dumps(d)
>>> new_d = msgpack.loads(binary)
>>> new_d['key']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'key'
Run Code Online (Sandbox Code Playgroud)

这是因为键在调用后不是字符串,loads()而是未序列化为bytes对象。

>>> d.keys()
dict_keys(['key'])
>>> new_d.keys()
dict_keys([b'key'])
Run Code Online (Sandbox Code Playgroud)

似乎这与github中提到的未实现功能有关

我的问题是,是否有一种方法可以解决此问题或解决此问题,以确保在反序列化时可以使用相同的密钥?

我想使用,msgpack但是如果我无法dict使用str键构建对象,并且期望能够在反序列化时使用相同的键,它将变得毫无用处。

python msgpack

4
推荐指数
1
解决办法
1016
查看次数

标签 统计

msgpack ×2

python ×1

python-3.x ×1