如何处理JSON分页?PowerBI如何获取API全量分页数据?
解决UN SDG API分页获取数据问题
能不能跳过分页?
可以尝试一次性获取所有数据,这类API通常支持通过size参数调整每页返回的数据量。你可以在请求URL后追加&size=5137(也就是响应里的totalElements值),修改后的请求示例:
curl -X GET --header 'Accept: application/json' 'https://unstats.un.org/sdgapi/v1/sdg/Indicator/Data?indicator=2.2.1&indicator=2.2.2&indicator=3.1.2&indicator=3.2.1&indicator=3.2.2&indicator=3.b.1&indicator=4.2.1&indicator=5.2.1&indicator=5.2.2&indicator=5.3.1&indicator=6.1.1&indicator=6.2.1&indicator=8.7.1&indicator=16.2.1&indicator=16.2.3&indicator=16.9.1&indicator=1.1.1&indicator=1.2.1&indicator=1.2.2&indicator=1.3.1&indicator=3.1.1&indicator=3.3.1&indicator=3.7.2&indicator=3.8.1&indicator=3.9.1&indicator=4.1.1&indicator=4.1.2&indicator=4.2.2&indicator=4.a.1&indicator=7.1.2&indicator=10.3.1&indicator=13.1.1&indicator=16.1.1&indicator=16.1.2&indicator=17.8.1&indicator=17.19.2&indicator=1.b.1&areaCode=051&areaCode=268&size=5137'
但要注意:部分API会限制单请求的最大返回数据量,如果这个请求报错,说明超过了平台限制,就只能用分页方式获取。
如何获取其余205页数据?
方法1:手动循环调用分页API
每个分页请求只需在URL后追加&pageNumber=N(N从2到206),比如第2页的请求:
curl -X GET --header 'Accept: application/json' 'https://unstats.un.org/sdgapi/v1/sdg/Indicator/Data?indicator=2.2.1&indicator=2.2.2&...&areaCode=051&areaCode=268&pageNumber=2'
把每一页返回的data数组提取出来,合并成一个完整的数据集即可。
方法2:在PowerBI中用Power Query自动处理分页(更高效)
这是最适配PowerBI数据源的方案,步骤如下:
- 打开PowerBI,点击「获取数据」→「Web」,输入原始API URL,加载数据。
- 进入Power Query编辑器,找到返回的JSON对象,展开
data字段,先加载第1页的数据。 - 点击「主页」→「高级编辑器」,修改M代码添加循环分页逻辑:
- 从第一页响应中提取
totalPages值,生成从1到该值的页码列表。 - 对每个页码,动态修改API URL的
pageNumber参数,发起请求并提取data。 - 把所有页的
data合并成一张表。
示例M代码大致结构:
let baseUrl = "https://unstats.un.org/sdgapi/v1/sdg/Indicator/Data?indicator=2.2.1&indicator=2.2.2&indicator=3.1.2&indicator=3.2.1&indicator=3.2.2&indicator=3.b.1&indicator=4.2.1&indicator=5.2.1&indicator=5.2.2&indicator=5.3.1&indicator=6.1.1&indicator=6.2.1&indicator=8.7.1&indicator=16.2.1&indicator=16.2.3&indicator=16.9.1&indicator=1.1.1&indicator=1.2.1&indicator=1.2.2&indicator=1.3.1&indicator=3.1.1&indicator=3.3.1&indicator=3.7.2&indicator=3.8.1&indicator=3.9.1&indicator=4.1.1&indicator=4.1.2&indicator=4.2.2&indicator=4.a.1&indicator=7.1.2&indicator=10.3.1&indicator=13.1.1&indicator=16.1.1&indicator=16.1.2&indicator=17.8.1&indicator=17.19.2&indicator=1.b.1&areaCode=051&areaCode=268", getPage = (page as number) => let url = baseUrl & "&pageNumber=" & Text.From(page), response = Json.Document(Web.Contents(url)), data = response[data] in data, firstPageResponse = Json.Document(Web.Contents(baseUrl)), totalPages = firstPageResponse[totalPages], pageList = List.Generate(()=>1, each _ <= totalPages, each _ +1), allData = List.Transform(pageList, getPage), combinedData = Table.Combine(List.Transform(allData, Table.FromRecords)) in combinedData - 从第一页响应中提取
- 关闭Power Query编辑器,加载合并后的数据集到PowerBI,即可作为仪表盘的数据源。
注意:调用API时不要过于频繁,避免触发平台速率限制导致请求被拦截。
内容的提问来源于stack exchange,提问作者Horaceman
相关产品推荐
相关产品推荐

