使用通配符获取所有节点

时间:2019-04-15 13:35:05

标签: r jsonlite

我正在尝试使用通配符从json文件中提取数据。

我要提取的数据是此json文件中每个玩家的游戏统计信息。他们在

http://statsapi-default-elb-prod-876255662.us-east-1.elb.amazonaws.com/api/v1/game/565711/boxscore

我已经使用此网站测试了jsonpath

http://jsonpath.herokuapp.com/

如果我输入此json路径

teams。 .players。 .person.fullName

我得到了所有球员的名单

"Shane Bieber",
"Jon Edwards",
"Max Moroff",
"Jake Bauers",
"Tyler Olson",
"Nick Wittgren",
"Carlos Carrasco",
"Leonys Martin",
"Neil Ramirez",
"Greg Allen",
"Kevin Plawecki",
"Brad Miller",
"Jordan Luplow".
etc...  

但是,当我将该代码放入r时,我得到一个错误

Error: unexpected '*' in "  repos$teams$*"

我尝试了以下代码

repos$teams$*$players$*$person$fullName
repos$teams$[*]$players$[*]$person$fullName
repos$teams$[[*]]$players$[[*]]$person$fullName

最终目标是将每个玩家的所有游戏统计信息收集到一个数据框中

有人可以指出正确的方向吗?我是R的JSON新手,以为我做得不错,然后就让我大吃一惊!哈!

谢谢!

2 个答案:

答案 0 :(得分:0)

base R和整洁的诗歌都不支持jsonpath。 R语言根本没有定义*来表示通配符。在R中,您必须映射集合以提取值。在R中,使用purrr包,我可能会做类似的事情

# repos <- jsonlite::fromJSON("http://statsapi-default-elb-prod-876255662.us-east-1.elb.amazonaws.com/api/v1/game/565711/boxscore")

library(purrr)
map(repos$teams, pluck, "players") %>% 
  unlist(recursive = FALSE) %>% 
  map_chr(pluck, "person", "fullName")

首先,我在各个团队上进行地图绘制,以提取主场和客场,然后使用pluck()函数将这些分组分配给每个小组。然后,我使用unlist()组合来自本国/外地的球员名单。然后,我再次使用pluck()映射所有玩家,以从每个玩家中提取person $ fullName。 map_chr将确保返回字符向量。 Pluck将为该向量命名,如果要删除名称,则可以在末尾添加%>% unname()

答案 1 :(得分:0)

您可以尝试使用rjsonpath软件包。它尚未在CRAN上,但在这里很有用。

安装后,您可以执行以下操作:

json_path(repos,  "$teams..players..person.fullName")

或者也许只是

json_path(repos,  "$..fullName")