You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS Lambda Python函数处理返回JSON中无穷值的问题

解决AWS Lambda返回含Infinity值JSON的解析错误

问题根源

JSON标准规范不允许inf/Infinity这类非标准数值,Python本地运行时可能使用了宽松的解析器,但AWS Lambda的Invoke操作采用严格的JSON解析规则,导致无法解析含inf的payload而抛出InvalidRequestContentException错误。

解决方案一:替换inf为合法浮点值(推荐)

在生成JSON的Lambda函数中,遍历结果数据,将所有inf/-inf替换为Python支持的最大/最小浮点值,或者业务场景允许的极值。这样能保证输出的JSON完全符合标准,从根源避免解析错误。

示例代码:

import json

def sanitize_for_json(data):
    """递归遍历数据,替换inf/-inf为合法浮点值"""
    if isinstance(data, float):
        if data == float('inf'):
            return float('max')  # Python最大浮点值,约1.7976931348623157e+308
        elif data == float('-inf'):
            return float('-max')
        return data
    elif isinstance(data, list):
        return [sanitize_for_json(item) for item in data]
    elif isinstance(data, dict):
        return {key: sanitize_for_json(value) for key, value in data.items()}
    return data

# 你的原始计算结果
raw_result = [0.008559854691925183, float('inf'), float('inf'), float('inf'), 0.0011680872601948522]
# 清理后的数据
clean_result = sanitize_for_json(raw_result)
# 生成标准JSON字符串
json_output = json.dumps(clean_result)

后续处理绘图的Lambda函数拿到数据后,可以识别这个最大值并做对应处理(比如替换为图表能显示的合理极值)。

解决方案二:自定义JSON编码器与解析器(需修改两个Lambda)

如果需要保留inf的语义,可以自定义JSON编码器输出"Infinity"字符串,同时在接收数据的Lambda中配置宽松的解析规则。

发送方Lambda(生成JSON)代码:

import json

class InfAwareEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, float):
            if obj == float('inf'):
                return "Infinity"
            elif obj == float('-inf'):
                return "-Infinity"
            elif obj != obj:  # 处理NaN值
                return "NaN"
        return super().default(obj)

raw_result = [0.008559854691925183, float('inf'), float('inf'), float('inf'), 0.0011680872601948522]
json_output = json.dumps(raw_result, cls=InfAwareEncoder)

接收方Lambda(处理绘图)代码:

import json

# 使用parse_constant参数解析Infinity/NaN
json_str = event['body']  # 假设从Lambda事件中获取JSON字符串
parsed_data = json.loads(json_str, parse_constant=lambda s: float(s))

注意:此方案需要同时修改两个Lambda,且依赖接收方的解析配置,通用性和稳定性不如方案一。

重要提示

不要尝试“忽略错误”,因为AWS Lambda的Invoke操作在payload解析失败时会直接中断流程,无法跳过解析步骤。必须确保输出的JSON符合标准规范,才能让整个流程正常执行。

内容的提问来源于stack exchange,提问作者HarlesChoskinson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 12:35:18