【问题标题】:Import JSON file in R and further process it as table在 R 中导入 JSON 文件并将其进一步处理为表
【发布时间】:2015-08-22 16:32:34
【问题描述】:

我对 R 很陌生。一整天都在尝试解决一个问题。不幸的是,我无法解决它。

我想在 R 中导入 JSON 文件,然后有机会以与导入 CSV 文件时相同的方式进一步处理它。

我的 JSON 文件必须具有以下结构:

{ "reviewerID": "A2SUAM1J3GNN3B",
  "asin": "0000013714",
  "reviewerName": "J. McDonald",
  "helpful": [2, 3],
  "reviewText": "I bought this for my husband who plays the piano.
  He is having a wonderful time playing these old hymns. The music is at
  times hard to read because we think the book was published for singing
  from more than playing from. Great purchase though!",
  "overall": 5.0,
  "summary": "Heavenly Highway Hymns",
  "unixReviewTime": 1252800000,
  "reviewTime": "09 13, 2009"
}

我想导入 JSON 文件,然后创建一个包含 9 列(reviewerID、asin、reviewerName 等)的表。

我尝试使用 R 包 jsonlite,但如果这样做,我会收到以下错误消息:

 data <- fromJSON('reviews_Office_Products.json.gz2')
 Error in feed_push_parser(buf) : parse error: trailing garbage
      "reviewTime": "07 19, 2013"} {"reviewerID": "A3BBNK2R5TUYGV"
                 (right here) ------^

你知道我可以完成我的任务吗?

非常感谢您。

最好的问候 保罗

【问题讨论】:

  • 您的 JSON 中很可能有错误。尝试jsonlite 包中的validate 函数来检查它是否是有效的JSON。如果打印输出正确(在记录之间),则看起来像缺少逗号。
  • 我也有同样的想法。当我应用 [validate] 函数时,出现以下错误:错误:is.character(txt) is not TRUE 您在哪里看到 JSON 格式不正确?
  • 在文本编辑器中检查是否有“reviewerID”的记录:“A3BBNK2R5TUYGV”和前面的记录之间有逗号 - 您帖子中的错误消息表明没有,但这可能只是因为消息选择不显示它。
  • 我检查了文本编辑器中的条目。有逗号。您知道如何使用此 json 文件进一步处理吗?我应该尝试将其在 python 中转换为 csv 文件,然后将其导入到 R 中吗?什么是最好的解决方案?
  • 看看这个,看看是不是同样的问题stackoverflow.com/questions/26519455/…

标签: json r


【解决方案1】:

最后我做到了:

library(rjson)
url <- "reviews_Office_Products.json.gz2"
con = file(url, "r")
input <- readLines(con, -1L)
my_results <- lapply(X=input,fromJSON)

close(con)
tr.review <- ldply(lapply(input, function(x) t(unlist(fromJSON(x)))))
save(tr.review, file= 'tr.review.rdata')

出于我的目的,这是可行的,我可以使用 tm-package 进一步处理数据。

非常感谢您的帮助。 保罗

【讨论】:

    【解决方案2】:

    这行得通。您可能需要使用正则表达式以使其适合。请注意,R 正则表达式中需要双反斜杠而不是单反斜杠。

    library(rjson)
    library(magrittr)
    library(dplyr)
    library(lubridate)
    library(stringi)
    
    options(stringsAsFactors = FALSE)
    
    '{ "reviews": [ { "reviewerID": "A2SUAM1J3GNN3B",
      "asin": "0000013714",
      "reviewerName": "J. McDonald",
      "helpful": [2, 3],
      "reviewText": "I bought this for my husband who plays the piano.
      He is having a wonderful time playing these old hymns. The music is at
      times hard to read because we think the book was published for singing
      from more than playing from. Great purchase though!",
      "overall": 5.0,
      "summary": "Heavenly Highway Hymns",
      "unixReviewTime": 1252800000,
      "reviewTime": "09 13, 2009"
    } { "reviewerID": "A2SUAM1J3GNN3B",
      "asin": "0000013714",
      "reviewerName": "J. McDonald",
      "helpful": [2, 3],
      "reviewText": "I bought this for my husband who plays the piano.
      He is having a wonderful time playing these old hymns. The music is at
      times hard to read because we think the book was published for singing
      from more than playing from. Great purchase though!",
      "overall": 5.0,
      "summary": "Heavenly Highway Hymns",
      "unixReviewTime": 1252800000,
      "reviewTime": "09 13, 2009"
    } ] }' %>%
      writeLines("reviews_Office_Products.json.gz2")
    
    data = 
      "reviews_Office_Products.json.gz2" %>%
      readLines %>%
      stri_replace_all_regex("\\}[ \\n]*\\{", "},{") %>%
      paste(collapse = "\n") %>%
      fromJSON %>%
      .[[1]] %>%
      lapply(as.data.frame) %>%
      bind_rows %>%
      select(-unixReviewTime) %>%
      mutate(asin = as.numeric(asin),
             reviewTime = mdy(reviewTime) )
    
    review = 
      data %>%
      select(-helpful) %>%
      distinct
    
    review__helpful =
      data %>%
      select(reviewerID, helpful) %>%
      distinct
    

    【讨论】:

    • 非常感谢。我会尽快尝试。如何将这些代码与我的 JSON 文件连接起来?据我了解,您使用上面输入的 JSON 内容的代码。
    • 第一部分只是生成一个我认为可能与您的文件相似的文件。 data = 之后的所有内容都应该适合您。就像我说的那样,它可能不起作用,特别是如果我猜错了 JSON 文件的结构,或者正则表达式不能解决缺少逗号的问题(它在 } 和 { 之间插入一个逗号,只用空格和换行符分隔)。特别是,如果您有可能在任何列中使用向量,那么 lapply as.data.frame 将不起作用。我也希望 reviewerID 是一个唯一的 ID,这样您就可以保持评论和有用之间的联系。
    • 我已经很绝望了。已经尝试了几种解决方法,但到目前为止没有任何效果:(。使用您的代码尝试它时,我在输入 data = ... 后收到以下错误消息: eval 中的错误(expr,envir,enclos):找不到对象'unixReviewTime' ...有什么想法吗?
    • %>% 命令将一个命令附加到前一个命令上。因此,调试语句的最简单方法是运行从 data = 开始的命令,每次都添加一个新行,然后检查生成的数据对象是否符合您的预期。关键的地方在fromJSON的最后(所以可以看list结构)和bind_rows的最后(可以看dataframe)。
    猜你喜欢
    • 2014-01-22
    • 1970-01-01
    • 2015-06-18
    • 2023-03-19
    • 2021-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多