You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用jsonlite将API返回JSON转R对象时遇Lexical error求助

解决Open-Notify API JSONP格式解析及正则语法错误问题

问题根源

  1. JSONP格式导致解析失败:请求URL中添加了callback=?,使得API返回JSONP格式(内容被?(...)包裹),而非标准JSON结构,jsonlite::fromJSON仅支持解析标准JSON,因此抛出词法错误。
  2. 正则特殊字符未转义:?是正则表达式的特殊元字符(表示匹配前一个元素0或1次),直接用str_replace_all(.,'?','')会触发正则语法错误。

解决方案

方案1:直接请求标准JSON(推荐)

Open-Notify的API默认返回标准JSON,无需添加callback参数,修改URL即可:

library(pacman)
p_load(tidyverse, janitor, usethis, httr, jsonlite)

# 移除callback参数,获取标准JSON
res = GET("http://api.open-notify.org/astros.json")
data = fromJSON(rawToChar(res$content))

# 验证结果
names(data)
# 输出:"people"  "number"  "message"

方案2:处理JSONP格式字符串

若因特殊需求必须使用JSONP格式,需正确处理正则特殊字符:

方法A:固定字符串匹配(规避正则解析)

用fixed()包裹匹配模式,让函数按普通字符串处理:

data = rawToChar(res$content) %>% 
  str_replace_all(fixed("?("), "") %>% 
  str_replace_all(fixed(")"), "") %>% 
  fromJSON()

方法B:转义正则特殊字符

将?和(转义为\\?和\\(,同时用^和$限定匹配范围,避免误替换内容中的字符:

data = rawToChar(res$content) %>% 
  str_replace_all("^\\?\\(", "") %>%  # 匹配开头的?(
  str_replace_all("\\)$", "") %>%     # 匹配结尾的)
  fromJSON()

内容的提问来源于stack exchange,提问作者Abe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 13:33:20