尝试使用 jsonlite 将从 API 检索到的 JSON 数据转换为 R 对象时出现词法错误

问题描述 投票:0回答:1

我正在尝试练习通过 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=`(`)

我很茫然。

r json
1个回答
0
投票

根据 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\" ..."
© www.soinside.com 2019 - 2024. All rights reserved.