使用jsonlite将API返回JSON转R对象时遇Lexical error求助
解决Open-Notify API JSONP格式解析及正则语法错误问题
问题根源
- JSONP格式导致解析失败:请求URL中添加了
callback=?,使得API返回JSONP格式(内容被?(...)包裹),而非标准JSON结构,jsonlite::fromJSON仅支持解析标准JSON,因此抛出词法错误。 - 正则特殊字符未转义:
?是正则表达式的特殊元字符(表示匹配前一个元素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
相关产品推荐
相关产品推荐

