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

如何替换API返回字典中的NaN值以解决Power Query解析错误

解决JSON中NaN导致Power Query导入错误的方案

核心问题

API返回的JSON中包含NaN(非合法JSON值),Power Query无法识别,因此需要将所有NaN/inf等非法值替换为合法的null或-。


方法1:递归遍历替换所有嵌套结构中的非法值

由于API返回的数据通常是嵌套的字典/列表结构,需要递归遍历所有元素进行替换,同时兼容numpy和原生Python的NaN:

import numpy as np
import json

def clean_invalid_values(obj, replacement=None):
    # 处理字典
    if isinstance(obj, dict):
        return {k: clean_invalid_values(v, replacement) for k, v in obj.items()}
    # 处理列表
    elif isinstance(obj, list):
        return [clean_invalid_values(item, replacement) for item in obj]
    # 处理float类型的NaN/inf
    elif isinstance(obj, float) and (np.isnan(obj) or np.isinf(obj)):
        return replacement
    # 处理字符串类型的"NaN"(部分API会返回字符串格式的NaN)
    elif isinstance(obj, str) and obj.lower() in ["nan", "inf", "-inf"]:
        return replacement
    # 其他类型直接返回
    else:
        return obj

# 假设api_response是从investing4获取的原始数据
processed_data = clean_invalid_values(api_response, replacement=None)  # 替换为null,若要"-"则传replacement="-"

# 导出合法JSON
with open("etf_finance_data.json", "w", encoding="utf-8") as f:
    json.dump(processed_data, f, ensure_ascii=False, indent=2)

方法2:利用JSON序列化的default参数处理

在序列化JSON时指定default函数,自动捕获并替换非法值:

import numpy as np
import json

def json_serializer(obj):
    # 处理数值型NaN/inf
    if isinstance(obj, float) and (np.isnan(obj) or np.isinf(obj)):
        return None  # 替换为null,换成"-"则返回"-"
    # 处理numpy数组(若API返回数组类型)
    elif isinstance(obj, np.ndarray):
        return obj.tolist()
    # 其他无法序列化的类型抛出异常(可选)
    raise TypeError(f"无法序列化类型: {type(obj).__name__}")

# 直接序列化并导出
with open("etf_finance_data.json", "w", encoding="utf-8") as f:
    json.dump(api_response, f, ensure_ascii=False, indent=2, default=json_serializer)

为什么之前用np.isnan无效?

  1. 未处理嵌套结构:仅替换了顶层字段,没有遍历字典/列表中的深层元素;
  2. 类型不兼容:若API返回的是字符串格式的"NaN",np.isnan无法识别;
  3. 未覆盖inf:部分API可能返回inf/-inf,同样属于非法JSON值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 03:51:43