Python中msgpack字典字符串键反序列化为bytes的问题及解决问询
解决Msgpack序列化字符串键字典后反序列化键变为bytes的问题
这个坑我之前踩过!确实挺头疼的——用msgpack序列化带字符串键的字典后,反序列化出来的键居然变成了bytes类型,导致用原字符串访问直接报KeyError。别担心,有几个简单的解决办法:
方法1:加载时用raw=False参数(最推荐)
这是最直接的官方解决方案,在调用msgpack.loads()的时候加上raw=False,msgpack会自动把所有bytes类型的键和值转换回字符串:
import msgpack d = {'key': 1234} binary = msgpack.dumps(d) new_d = msgpack.loads(binary, raw=False) print(new_d['key']) # 顺利输出1234,不会触发KeyError
主流版本的msgpack都支持这个参数,兼容性没问题,优先用这个。
方法2:手动转换字典的键
如果因为环境限制没法用raw=False,可以手动遍历反序列化后的字典,把bytes键解码成字符串:
import msgpack d = {'key': 1234} binary = msgpack.dumps(d) new_d = msgpack.loads(binary) # 把所有bytes键转成utf-8字符串(如果你的键用了其他编码,替换成对应的就行) fixed_dict = {k.decode('utf-8'): v for k, v in new_d.items()} print(fixed_dict['key']) # 正常访问无压力
方法3:序列化时指定字符串类型
在序列化的时候加上use_bin_type=False,让msgpack把字符串序列化为msgpack标准的字符串类型,而不是二进制类型,这样反序列化时直接得到字符串:
import msgpack d = {'key': 1234} binary = msgpack.dumps(d, use_bin_type=False) new_d = msgpack.loads(binary) print(new_d['key']) # 直接用原字符串键访问没问题
不过要注意,这个方法需要序列化和反序列化的两端都保持一致的参数设置,不然可能出现兼容性问题。
其实这个问题是因为msgpack早期默认把字符串当作二进制数据处理,现在通过这些参数就能轻松解决,完全不影响正常使用msgpack的~
内容的提问来源于stack exchange,提问作者nmlq
相关产品推荐
相关产品推荐

