我在我的代码中遇到过几次这个问题并且在一个小案例中无法重现它,但我希望有人能指出我正确的方向。它在创建一个保存对象时出现(它基本上将我程序的不同部分打包为一系列嵌套的dicts,然后将它们pickle写入文本文件)。以下是代码的相关部分:
so = {}
for l in self.components.items():
so[l[0]] = l[1].createSaveObject()
temp = so
print "Component SO:",temp
print "Component Pickled:",jsonpickle.encode(temp)
return jsonpickle.encode(temp)
因此函数遍历我的组件,为每个组件创建字典项,然后返回pickle结果。问题显示在两个打印语句中,它们提供以下输出(截断以忽略正在被腌制的工作组件而没有问题):
Component SO: {..., 'points': {201: [(43, 614.6), (268, 614.6), (268, 254.6), (43, 254.6)], 2041: [(79.5, 607.15999999999997), (304.5, 607.15999999999997), (304.5, 247.16), (79.5, 247.16)]},...}
Component Pickled: {..., "points": {"201": [{"py/tuple": [43, 614.6]}, {"py/tuple": [268, 614.6]}, {"py/tuple": [268, 254.6]}, {"py/tuple": [43, 254.6]}], "2041": [{"py/tuple": [null, null]}, {"py/tuple": [null, null]}, {"py/tuple": [null, null]}, {"py/tuple": [null, null]}]},...}
如您所见,包含高精度数字的字典条目(以及截断为常规值的同一部分中的其他元素)被编码为null。我无法从python shell重现这一点 - 它只在程序运行时发生。但是,我不确定如何找到源,因为两个输出之间的唯一区别是jsonpickle.encode调用。
谢谢!
答案 0 :(得分:2)
使用numpy.average的输出时遇到了类似的问题。发现这个代码在我的用例中起作用:
import numpy as np
class NumpyFloatHandler(jsonpickle.handlers.BaseHandler):
"""
Automatic conversion of numpy float to python floats
Required for jsonpickle to work correctly
"""
def flatten(self, obj, data):
"""
Converts and rounds a Numpy.float* to Python float
"""
return round(obj,6)
jsonpickle.handlers.registry.register(np.float, NumpyFloatHandler)
jsonpickle.handlers.registry.register(np.float32, NumpyFloatHandler)
jsonpickle.handlers.registry.register(np.float64, NumpyFloatHandler)