【问题标题】:R: lexical error: invalid char in json textR:词法错误:json文本中的无效字符
【发布时间】:2020-01-15 04:41:17
【问题描述】:

我正在从 python 转换为 R,这是我第一次尝试解析 Json。我尝试过 jsonlite、RJSONIO 和 rjson。他们都停在getlabskaters <- fromJSON(getlabskatersRaw)。稍微解释一下这个脚本,因为我显然需要一些关于如何正确解析 json 的帮助。它开始购买一个网站,该网站返回一些球队,我在 for 循环中使用这些球队来返回具有该球队列表的所有球员。奇怪的是,当我运行上面的fromJSON 时不会发生错误,它只会在我将它放入 for 循环时发生。我检查了paste0print(getlabskatersRaw) 的链接。所有这些看起来都可以浏览。对错误的一些帮助会很棒,如果您感到无聊并且对更好的解析策略有任何建议,我会全力以赴。

library(magrittr)
library(readr)
library(tidyr)
library(dplyr)
library(lubridate)
library(jsonlite)
library(httr)
library(stringi)
library(tidyverse)
library(httr)

# GET Todays date
today <- Sys.Date()

#Json return from URL
getlabteamsRaw<-paste0('https://www.fantasylabs.com/api/lines/4/', as.character(today),'/startinggoalies')

# Turn Value into List
getlabteams <- fromJSON(getlabteamsRaw)

# Parse home team
team<-getlabteams$GoalieMatchups$Properties$HomeTeam

# Convert 
Home_Fullname<-as.data.frame(team)
team<-getlabteams$GoalieMatchups$Properties$VisitorTeam
Away_Fullname<-as.data.frame(team)
LabTeams <- full_join(Home_Fullname, Away_Fullname, by = c("team"))

# PLAYER INDIVIDUAL NULL DF's
lab_skaters_df <- NULL

for(labtm in LabTeams){
  getlabskatersRaw<-paste0('https://www.fantasylabs.com/api/lines/4/', as.character(labtm),'/', as.character(today))

  ### THE ERROR IS HERE########
  getlabskaters <- fromJSON(getlabskatersRaw)

  # Parse Player name
  new<-getlabskaters$PlayerLines$Properties$FullName

  # Convert Value to Dataframe
  Fullname<-as.data.frame(new)

  #APPEND FEATURE 
  lab_skaters_df <- rbind(lab_skaters_df, Fullname)
}

【问题讨论】:

    标签: r jsonlite rjson rjsonio


    【解决方案1】:

    我知道这是一个非答案,因为我只是在转储代码,并没有解释问题,但这对你有用。我还清理了你的代码(你正在加载一堆你实际上没有使用的包,或者已经通过library(tidyverse) 加载),我正在使用purrr 包中的map_df 函数循环遍历团队而不是 for 循环。

    library(jsonlite)
    library(tidyverse)
    
    # GET Todays date
    today <- Sys.Date()
    
    #Json return from URL
    getlabteamsRaw <- paste0('https://www.fantasylabs.com/api/lines/4/', today, '/startinggoalies')
    
    # Turn Value into List
    getlabteams <- fromJSON(getlabteamsRaw)
    
    teams <- c(getlabteams$GoalieMatchups$Properties$HomeTeam, getlabteams$GoalieMatchups$Properties$VisitorTeam)
    
    myfun <- function(x) {
      getlabskatersRaw <- paste0('https://www.fantasylabs.com/api/lines/4/', x,'/', today)
      getlabskaters <- fromJSON(getlabskatersRaw)
      select(getlabskaters$PlayerLines$Properties, FullName, Position, Position, Line, Team, OppTeam, Salary_DK, Salary_FD, ActualPoints_DK, ActualPoints_FD, ImpPts_DK, ImpPts_FD)
    }
    
    myfinal_df <- map_df(teams, myfun)
    
    # Wait a few seconds
    myfinal_df
                   FullName Position Line               Team             OppTeam Salary_DK Salary_FD
    1       Phillip Danault       1C   1F Montreal Canadiens  Chicago Blackhawks      5400      5500
    2           Carey Price       1G   1G Montreal Canadiens  Chicago Blackhawks      7900      8400
    3           Ben Chiarot      1LD   1D Montreal Canadiens  Chicago Blackhawks      4400      4000
    4           Tomas Tatar      1LW   1F Montreal Canadiens  Chicago Blackhawks      5800      6400
    5            Shea Weber      1RD   1D Montreal Canadiens  Chicago Blackhawks      6400      6200
    

    【讨论】:

    • 谢谢菲尔,你的权利它确实有效并清理了我的代码。除了“玩家”价值,我还想获取其他价值。我是否只是复制 enframe 行并重复或添加到 enframe 中的 value = part?另外,如何将该 tibble 转换为数据框以进行访问?
    • tibble 是一个数据框,但如果您对它不满意,请随意使用as.data.frame()。对于您的第一个问题,最简单的方法可能是重复为您想要的每组值创建一个函数的过程,然后对每个函数重复使用 map_df,并将每个函数存储到它们的拥有自己的数据框/小标题,然后将它们与left_join()结合起来。
    • 好的,感谢您的知识和快速响应!还没有在 R 中使用函数,所以我现在绝对应该开始! tibble 的名字是什么?我会做new_df&lt;-as.data.fram(nameoftibble)吗?
    • 如果你有一个你想要传递的其他信息的例子,它可能都可以在同一个自定义函数调用中完成,这样效率会高得多。在不确切知道自己想要什么的情况下,很难演示如何。
    • 职位、线路、团队、OppTeam、Salary_DK、Salary_FD 、ActualPoints_DK 、ActualPoints、ImpPts_DK、ImpPts_FD。这些是我需要的其他人
    猜你喜欢
    • 1970-01-01
    • 2017-04-21
    • 2012-09-20
    • 2021-04-21
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多