R语言fromJSON读取美人口普查局贸易API数据解析报错求解
R读取人口普查局贸易API报JSON解析错误的排查解决思路
报错根因
这个错误不是接口未返回JSON格式内容,本质是接口返回的JSON数据中,商品描述字段存在未做转义处理的非法控制字符/孤立引号。
一年前代码可正常运行,是因为当时2021年的贸易数据集尚未录入带这类特殊字符的商品描述内容;后续普查局更新补录历史数据时,未对写入的文本做JSON标准转义,导致jsonlite默认严格解析模式下直接抛出词法错误。
另外你当前代码只定义了API key变量但没有拼接到请求URL中,无key请求容易被接口截断返回内容,也可能加剧JSON格式异常问题。
排查步骤
- 不要直接把URL传入
fromJSON(),先用httr显式拉取原始响应内容,先确认请求状态正常,再定位异常字符位置,参考代码:
library(httr) library(jsonlite) library(tidyverse) library(janitor) year <- 2021 # 把自己申请的API key拼到URL末尾 req_url <- paste0("https://api.census.gov/data/timeseries/intltrade/exports/hs?get=ALL_VAL_YR,ALL_VAL_MO,E_COMMODITY,E_COMMODITY_SDESC,E_COMMODITY_LDESC,MONTH,QTY_1_YR,UNIT_QY1&YEAR=",year,"&key=你的实际APIkey") # 发送GET请求 resp <- GET(req_url) # 检查请求状态,返回状态码200才是正常响应 http_status(resp) # 提取原始返回的文本内容 raw_content <- content(resp, as = "text", encoding = "UTF-8")
- 拿到原始文本后,直接搜索报错提示里的文本片段
ANY OTHER SINGLE FRUIT, NUT OR VEG, UNFERMENTED AND NOT C,就能看到该位置附近存在未转义的换行、回车或者孤立双引号,这类字符不符合JSON语法规范,是触发报错的直接原因。
修复方案
优先使用文本预清洗的方案,稳定性最高:
- 在解析前先对原始返回文本做清洗,替换掉所有未转义的非法控制字符、孤立引号,再传入解析函数,参考代码:
# 清洗JSON文本中的非法字符 cleaned_json <- raw_content %>% # 替换所有未被反斜杠转义的换行、回车符为空格 str_replace_all("(?<!\\\\)\\r|(?<!\\\\)\\n", " ") %>% # 转义所有字符串值内部未转义的孤立双引号 str_replace_all('(?<!\\\\)"(?=[^,\\[\\]]*?[,"\\]])', '\\\\"') # 解析清洗后的内容 export_raw <- fromJSON(cleaned_json) # 转换为数据框,第一行是字段名,提取后重置列名再删除首行 export_API <- as.data.frame(export_raw) names(export_API) <- export_API[1,] export_API <- export_API[-1,] %>% clean_names()
如果是临时取数需要快速跑通,也可以尝试降低解析校验等级,不过该方案容错边界不可控,不建议用于定期跑批的脚本:
export_API <- as.data.frame(fromJSON(raw_content, validate = FALSE))
内容的提问来源于stack exchange,提问作者mustafghan
相关产品推荐
相关产品推荐

