调用API后使用fromJSON转换数据遭遇JSON语法错误求助
问题根源与解决方案
嘿,我一眼就看出问题所在啦!你遇到的错误完全是因为用错了解析工具——你调用API时加了&csv参数,这说明你明确要求返回CSV格式的数据,但你却用解析JSON的fromJSON()函数去处理它,自然会触发语法错误。
具体原因拆解
- 你的API请求URL末尾带了
&csv,服务端会直接返回CSV文本(你可以打印rawToChar(test_county$content)的前几行,就能看到开头是date,nass_week,nass_week_year,...,这是标准的CSV结构)。 jsonlite::fromJSON()只能解析JSON格式的文本,面对CSV的逗号分隔结构,它会识别为无效的JSON字符,所以抛出"invalid char in json text"错误。
修正后的解决代码
既然返回的是CSV,直接用CSV解析工具处理就好,这里提供两种简单的实现方式:
方法1:用httr自带的content()函数自动解析(推荐)
httr::content()会根据响应的Content-Type自动选择合适的解析方式,非常省心:
library(httr) library(readr) # 依赖readr来解析CSV,也可以用base的read.csv # 发起API请求 test_county <- GET("https://nass.agroclimate.org/ws/data/daily.php?county=USAL01001&sdate=20220101&edate=20220108&csv") # 自动解析为dataframe df <- content(test_county, type = "text/csv", show_col_types = FALSE)
方法2:手动转换为字符后读取CSV
如果你想手动控制解析过程,可以先把响应内容转成字符,再用CSV读取函数处理:
library(httr) library(readr) test_county <- GET("https://nass.agroclimate.org/ws/data/daily.php?county=USAL01001&sdate=20220101&edate=20220108&csv") # 转换为字符后读取为dataframe csv_text <- rawToChar(test_county$content) df <- read_csv(csv_text, show_col_types = FALSE)
额外验证小技巧
以后遇到类似的响应格式疑惑,可以用以下代码快速确认返回内容的类型:
# 查看响应的Content-Type cat(content_type(test_county)) # 打印响应内容的前100个字符,快速判断格式 cat(substr(rawToChar(test_county$content), 1, 100))
内容的提问来源于stack exchange,提问作者Alex T.
相关产品推荐
相关产品推荐

