快速JSON到data.frame / data.table

时间:2017-06-26 23:02:18

标签: json r dataframe

我有R代码将JSON数据转换为data.frame。它工作正常但对于巨大的JSON文件来说相当慢。什么是更有效的方法(不介意有data.table输出?)

    json_data <- fromJSON(json_dt_url)
    json_data <- json_data[['data']]
    my_df <- data.frame()
    for (i in 1:length(json_data))
    {
      my_df <- rbind(my_df, as.data.frame(json_data[[i]]))
    }

3 个答案:

答案 0 :(得分:1)

如果您要快速进行JSON解析,请查看RcppSimdJson

library(RcppSimdJson)
jsonfile <- system.file("jsonexamples", "small", "demo.json", package="RcppSimdJson")
res <- fload(jsonfile)

str(res)
#> List of 1
#>  $ Image:List of 6
#>   ..$ Width    : int 800
#>   ..$ Height   : int 600
#>   ..$ Title    : chr "View from 15th Floor"
#>   ..$ Thumbnail:List of 3
#>   .. ..$ Url   : chr "http://www.example.com/image/481989943"
#>   .. ..$ Height: int 125
#>   .. ..$ Width : int 100
#>   ..$ Animated : logi FALSE
#>   ..$ IDs      : int [1:4] 116 943 234 38793

reprex package(v0.3.0)于2020-08-05创建

使用软件包中的基准测试代码,我们可以比较不同的解析方法:

file <- system.file("jsonexamples", "mesh.json", package = "RcppSimdJson")

res <- bench::mark(
  RcppSimdJson = RcppSimdJson::fload(file),
  jsonlite = jsonlite::fromJSON(file),
  jsonify = jsonify::from_json(file),
  RJSONIO = RJSONIO::fromJSON(file),
  ndjson = ndjson::stream_in(file),
  check = FALSE
)

res
#> # A tibble: 5 x 6
#>   expression        min   median `itr/sec` mem_alloc `gc/sec`
#>   <bch:expr>   <bch:tm> <bch:tm>     <dbl> <bch:byt>    <dbl>
#> 1 RcppSimdJson   1.51ms   1.67ms    582.      5.82MB     5.98
#> 2 jsonlite      44.68ms  48.95ms     18.8     2.74MB    22.6 
#> 3 jsonify        9.76ms  11.34ms     87.5     1.12MB    43.7 
#> 4 RJSONIO       33.11ms  35.17ms     28.6     2.93MB     3.82
#> 5 ndjson       136.35ms 138.67ms      7.21    9.41MB    30.6

reprex package(v0.3.0)于2020-08-05创建

我们看到RcppSimdJson是迄今为止最快的。

答案 1 :(得分:0)

data2 <- fromJSON("data.json", flatten = TRUE)

参考https://rdrr.io/cran/jsonlite/f/vignettes/json-apis.Rmd

答案 2 :(得分:0)

尝试这种方式:

library(jsonlite)
json_data <- read_json("data.json", simplifyVector = TRUE)

包含示例输入,以便我自己测试解决方案!