
在使用json.dumps()序列化数据时如果数据包含NaNNot a Number、Infinity正无穷或-Infinity负无穷等特殊浮点值会引发ValueError: Out of range float values are not JSON compliant因为标准的 JSON 规范并不支持这些特殊浮点数。解决方案为了避免ValueError可以在序列化前对数据进行预处理将NaN和无限值转换为可接受的格式。常见的处理方式包括手动替换这些值或使用自定义的JSONEncoder进行编码。通过default参数在序列化前遍历数据将NaN和无限大的浮点数转换为字符串或null以确保 JSON 兼容性。该方法适用于简单的 JSON 结构其中每个float值都会被检查并转换。importjsondefhandle_non_compliant_floats(value):ifisinstance(value,float):ifvaluefloat(inf):returnInfinityelifvaluefloat(-inf):return-Infinityelifvalue!value:# 检测 NaNreturnNaNreturnvalue data{normal:1.0,high:float(inf),low:float(-inf),undefined:float(nan)}# 处理特殊浮点数并序列化safe_json_datajson.dumps(data,defaulthandle_non_compliant_floats)print(safe_json_data)另一种方式是自定义JSONEncoder覆盖default方法在 JSON 序列化时自动转换这些特殊值。这种方法适用于更复杂的数据结构因为json.dumps()会递归调用default()方法处理嵌套对象。classCustomEncoder(json.JSONEncoder):defdefault(self,obj):ifisinstance(obj,float):ifobjfloat(inf):returnInfinityelifobjfloat(-inf):return-Infinityelifobj!obj:# 处理 NaNreturnNaNreturnsuper().default(obj)# 使用自定义 JSON 编码器safe_json_datajson.dumps(data,clsCustomEncoder)print(safe_json_data)运行代码后原本包含NaN和Infinity的数据成功转换为 JSON 兼容的字符串格式避免了ValueError{normal:1.0,high:Infinity,low:-Infinity,undefined:NaN}此方法确保 JSON 序列化不会因超范围浮点数而失败同时保留数据的完整性以便后续处理或存储。通过预处理数据或使用JSONEncoder自定义编码规则可以有效解决 JSON 序列化时的ValueError问题。具体方法的选择取决于数据结构的复杂性以及对NaN和无限值的存储要求。如果需要严格符合 JSON 规范可以将这些值转换为null如果需要保留信息可用字符串表示它们的特殊状态。