如何将Takealot卖家API返回的嵌套JSON完整转为Pandas Dataframe
解决方案
直接用pandas内置的json_normalize结合字段展开、合并操作即可实现,不需要额外依赖。核心逻辑是先保留上层基础字段,再逐个展开嵌套的数组字段,最后按商品唯一标识tsin_id和offer_id合并。
完整修改后代码
import pandas as pd from pandas import json_normalize import requests as rq from datetime import datetime from functools import reduce # API信息 url = "https://seller-api.takealot.com/v2" endpoint = "/offers?" api_key = "Key xyz" header = { 'Authorization': api_key } full_url = url + endpoint response = rq.get(full_url, headers=header) # 增加响应状态校验,避免接口报错导致后续逻辑崩溃 if response.status_code != 200: print(f"接口请求失败,状态码:{response.status_code},错误信息:{response.text}") exit() # 直接用requests内置的json解析,不需要额外用json库加载 info = response.json() df = json_normalize(info["offers"]) # 定义嵌套字段展开通用方法 def expand_nested_col(df, col_name, prefix): # 炸开列表结构,每个数组元素生成一行 exploded = df[['tsin_id', 'offer_id', col_name]].explode(col_name, ignore_index=True) # 展开字典结构,统一加前缀避免字段重名 expanded = json_normalize(exploded[col_name]).add_prefix(f"{prefix}.") # 关联主键返回 return pd.concat([exploded[['tsin_id', 'offer_id']], expanded], axis=1) # 筛选不包含嵌套数组的基础字段 base_cols = [col for col in df.columns if col not in ['leadtime_stock', 'stock_at_takealot', 'stock_on_way', 'stock_cover', 'sales_units']] df_base = df[base_cols] # 逐个处理需要展开的嵌套字段 df_leadtime = expand_nested_col(df, 'leadtime_stock', 'leadtime_stock') df_takealot_stock = expand_nested_col(df, 'stock_at_takealot', 'stock_at_takealot') df_onway_stock = expand_nested_col(df, 'stock_on_way', 'stock_on_way') df_stock_cover = expand_nested_col(df, 'stock_cover', 'stock_cover') df_sales_units = expand_nested_col(df, 'sales_units', 'sales_units') # 按主键合并所有表,得到最终全量展开的DataFrame dfs = [df_base, df_leadtime, df_takealot_stock, df_onway_stock, df_stock_cover, df_sales_units] df_final = reduce(lambda left, right: pd.merge(left, right, on=['tsin_id', 'offer_id'], how='left'), dfs) # 可打印查看字段 print(df_final.columns.tolist()) # 结束时间 print(datetime.now().strftime('%H:%M:%S'))
效果说明
- 所有嵌套字段会自动加前缀避免重名,比如
leadtime_stock下的仓库ID会生成字段名leadtime_stock.merchant_warehouse.warehouse_id - 如果单个商品对应多个仓库的库存数据,会自动拆分为多行,不会丢失数据
- 不需要的嵌套字段可以直接删除对应
expand_nested_col的调用行即可
内容的提问来源于stack exchange,提问作者DDV
相关产品推荐
相关产品推荐

