Flask Rest API多JSON响应转Pandas DataFrame失败求助
嘿,我之前也碰到过类似的麻烦,从API拿数据转DataFrame的时候踩过不少坑,咱们一步步来排查解决:
首先确认API返回的JSON格式
先别着急转DataFrame,先把API返回的内容打出来看看,用print(response.text)就行。一般会遇到两种常见格式:
情况1:返回的是标准JSON数组(最常见)
如果输出是像[{"asset_id": "1", "value": 100}, {"asset_id": "2", "value": 200}]这样的数组,那直接解析转DataFrame就行:
import requests import pandas as pd # 调用API response = requests.get("你的Flask API地址") # 解析JSON为列表 data_list = response.json() # 转成DataFrame df = pd.DataFrame(data_list)
要是这里报错,大概率是JSON格式有问题,比如API返回了错误页(比如500错误的HTML),或者数组里有格式不统一的对象,这时候得先修正API返回的内容,或者过滤掉无效的对象。
情况2:返回的是换行分隔的独立JSON(NDJSON格式)
有些API会每行返回一个JSON对象,比如:
{"asset_id": "1", "value": 100}
{"asset_id": "2", "value": 200}
这时候直接用response.json()会报错,因为这不是合法的JSON数组,得逐行解析:
import requests import pandas as pd import json response = requests.get("你的Flask API地址") # 按行拆分内容,过滤空行 lines = [line.strip() for line in response.text.split('\n') if line.strip()] # 逐行解析JSON data_list = [json.loads(line) for line in lines] # 转DataFrame df = pd.DataFrame(data_list)
处理嵌套JSON的情况
如果每个JSON对象里还有嵌套的子对象,比如{"asset_id": "1", "details": {"price": 100, "location": "NY"}},直接用pd.DataFrame()会把details列变成字典,这时候可以用pd.json_normalize()来扁平化数据:
df = pd.json_normalize(data_list)
这样会生成asset_id、details.price、details.location这样的列,方便后续处理。
常见错误排查
- 要是碰到
ValueError: Expected object or value:先检查response.text,是不是API返回了非JSON内容(比如错误页面),或者JSON格式有语法错误(比如逗号漏了、引号不匹配)。 - 要是碰到
TypeError: 'dict' object is not callable:大概率是你漏了括号,应该是response.json()而不是response.json,后者是引用方法对象,不是调用它。
如果还是解决不了,把具体的错误信息和API返回的内容片段贴出来,我再帮你精准定位问题~
内容的提问来源于stack exchange,提问作者SSingh

