如何替换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无效?
- 未处理嵌套结构:仅替换了顶层字段,没有遍历字典/列表中的深层元素;
- 类型不兼容:若API返回的是字符串格式的
"NaN",np.isnan无法识别; - 未覆盖
inf:部分API可能返回inf/-inf,同样属于非法JSON值。
内容的提问来源于stack exchange,提问作者leolapa
相关产品推荐
相关产品推荐

