如何在Vega-Lite中适配OECD API的非标准JSON数据?
解决Vega-Lite调用OECD API的格式问题
你的核心问题在于OECD返回的SDMX-JSON结构需要额外处理:observations中的key是时间维度的索引值而非直接年份,且数值以数组形式存储。以下是修正后的配置,能正常解析并生成图表:
{ "$schema": "https://vega.github.io/schema/vega-lite/v5.2.json", "data": { "url": "https://stats.oecd.org/SDMX-JSON/data/REV/NES.TOTALTAX.TAXGDP.OAVG?contentType=json", "format": {"type": "json"} }, "transform": [ // 展开observations的键值对,将索引和数值数组拆分为字段 { "type": "fold", "fold": {"expr": "keys(data('source_0').dataSets[0].series['0:0:0:0'].observations)"}, "as": ["timeIndex", "valueArray"] }, // 从structure中提取时间维度的年份标签 { "calculate": "data('source_0').structure.dimensions.observation[0].values[parseInt(datum.timeIndex)].name", "as": "year" }, // 提取数值数组中的有效数据,过滤空值 { "calculate": "datum.valueArray[0]", "as": "Tax_revenue" }, {"filter": "datum.Tax_revenue !== null"} ], "mark": "line", "encoding": { "x": {"field": "year", "type": "temporal", "title": "年份"}, "y": {"field": "Tax_revenue", "type": "quantitative", "title": "税收收入占GDP比重"} } }
关键修正点:
- 不直接在format中指定property:保留完整JSON结构,才能读取
structure里的时间维度映射关系。 - fold转换键值对:将
observations中的每个键值对拆成独立数据行,让时间索引和数值可被后续处理。 - 映射实际年份:通过
structure.dimensions.observation[0].values,把时间索引转换成真实年份标签。 - 过滤空值:移除
Tax_revenue为null的数据行,避免图表显示异常。
如果要使用你提供的另一个API链接(REVGBR),只需替换url字段即可,核心转换逻辑通用。
内容的提问来源于stack exchange,提问作者user888469
相关产品推荐
相关产品推荐

