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

Nat*_*Coy 4 python msgpack

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键构建对象,并且期望能够在反序列化时使用相同的键,它将变得毫无用处。

Nat*_*Coy 7

调用dumps或时设置默认编码packb

:param str encoding:
 |      Convert unicode to bytes with this encoding. (default: 'utf-8')
Run Code Online (Sandbox Code Playgroud)

但是在调用或时,默认情况下设置它loadsunpackb如下所示:

Help on built-in function unpackb in module msgpack._unpacker:

unpackb(...)
    unpackb(... encoding=None, ... )
Run Code Online (Sandbox Code Playgroud)

因此,更改反序列化的编码可解决此问题,例如:

>>> d['key'] = 1234
>>> binary = msgpack.dumps(d)
>>> msgpack.loads(binary, encoding = "utf-8")
{'key': 1234}
>>> msgpack.loads(binary, encoding = "utf-8") == d
True
Run Code Online (Sandbox Code Playgroud)

  • 编码已被弃用 - raw=True|False 是新方法。 (2认同)