我正在尝试练习通过 API 将数据检索到 R 中进行分析。我正在关注此处的教程:https://www.dataquest.io/blog/r-api-tutorial/,但它为 ISS API 引用的 URL 似乎已失效。但是,我在这里找到了替代品:http://open-notify.org/Open-Notify-API/。当我尝试将 JSON 实际转换为 R 数据时,我不断收到词汇错误。
我已经尝试过:
library(pacman)
p_load(
tidyverse
,janitor
,usethis
,httr
,jsonlite)
res = GET("http://api.open-notify.org/astros.json?callback=?")
rawToChar(res$content)
data = rawToChar(res$content) %>% fromJSON()
names(data)
这会产生错误,
Error: lexical error: invalid char in json text.
?({"people": [{"craft": "ISS",
(right here) ------^
致电
rawToChar(res$content)
给出
[1] "?({\"people\": [{\"craft\": \"ISS\", \"name\": \"Oleg Kononenko\"}, {\"craft\": \"ISS\", \"name\": \"Nikolai Chub\"}, {\"craft\": \"ISS\", \"name\": \"Tracy Caldwell Dyson\"}, {\"craft\": \"ISS\", \"name\": \"Matthew Dominick\"}, {\"craft\": \"ISS\", \"name\": \"Michael Barratt\"}, {\"craft\": \"ISS\", \"name\": \"Jeanette Epps\"}, {\"craft\": \"ISS\", \"name\": \"Alexander Grebenkin\"}, {\"craft\": \"ISS\", \"name\": \"Butch Wilmore\"}, {\"craft\": \"ISS\", \"name\": \"Sunita Williams\"}, {\"craft\": \"Tiangong\", \"name\": \"Li Guangsu\"}, {\"craft\": \"Tiangong\", \"name\": \"Li Cong\"}, {\"craft\": \"Tiangong\", \"name\": \"Ye Guangfu\"}], \"number\": 12, \"message\": \"success\"})"
所以我知道数据实际上正在被检索。
我尝试通过删除
rawToChar(res$content)
和 生成的字符串中的问号来清理字符串
data =
rawToChar(res$content) %>%
str_replace_all(.,'?','') %>%
fromJSON()
但这会产生
Error in stri_replace_all_regex(string, pattern, fix_replacement(replacement), :
Syntax error in regex pattern. (U_REGEX_RULE_SYNTAX, context=`?`)
我还尝试删除括号,以防出现问题
data =
rawToChar(res$content) %>%
str_replace_all(.,'(','') %>%
str_replace_all(.,')','') %>%
fromJSON()
但是得到了
Error in stri_replace_first_regex(string, pattern, fix_replacement(replacement), :
Incorrectly nested parentheses in regex pattern. (U_REGEX_MISMATCHED_PAREN, context=`(`)
我很茫然。
根据 http://open-notify.org/Open-Notify-API/People-In-Space/,在您的请求中包含
callback
会使其以 JSONP 而不是常规 JSON 进行响应.http://api.open-notify.org/astros.json
:
library(httr)
GET("http://api.open-notify.org/astros.json") |>
content() |>
str()
#> List of 3
#> $ people :List of 12
#> ..$ :List of 2
#> .. ..$ craft: chr "ISS"
#> .. ..$ name : chr "Oleg Kononenko"
#> ..$ :List of 2
#> .. ..$ craft: chr "ISS"
#> .. ..$ name : chr "Nikolai Chub"
#> ..$ :List of 2
#> .. ..$ craft: chr "ISS"
#> .. ..$ name : chr "Tracy Caldwell Dyson"
#> ..$ :List of 2
#> .. ..$ craft: chr "ISS"
#> .. ..$ name : chr "Matthew Dominick"
#> ..$ :List of 2
#> .. ..$ craft: chr "ISS"
#> .. ..$ name : chr "Michael Barratt"
#> ..$ :List of 2
#> .. ..$ craft: chr "ISS"
#> .. ..$ name : chr "Jeanette Epps"
#> ..$ :List of 2
#> .. ..$ craft: chr "ISS"
#> .. ..$ name : chr "Alexander Grebenkin"
#> ..$ :List of 2
#> .. ..$ craft: chr "ISS"
#> .. ..$ name : chr "Butch Wilmore"
#> ..$ :List of 2
#> .. ..$ craft: chr "ISS"
#> .. ..$ name : chr "Sunita Williams"
#> ..$ :List of 2
#> .. ..$ craft: chr "Tiangong"
#> .. ..$ name : chr "Li Guangsu"
#> ..$ :List of 2
#> .. ..$ craft: chr "Tiangong"
#> .. ..$ name : chr "Li Cong"
#> ..$ :List of 2
#> .. ..$ craft: chr "Tiangong"
#> .. ..$ name : chr "Ye Guangfu"
#> $ number : int 12
#> $ message: chr "success"
关于字符串清理过程中遇到的问题,
stringr
通常期望收到pattern
参数的正则表达式,而?
恰好在正则表达式中具有特殊含义。要匹配文字 ?
,您需要使用 \\
转义它或使用以下命令更改其含义
fixed()
或 coll()
:
library(stringr)
str_remove_all('?({"people" ...', '\\?')
#> [1] "({\"people\" ..."
str_remove_all('?({"people" ...', fixed('?'))
#> [1] "({\"people\" ..."