https://github.com/chrismuir/jsonparse
Fast JSON Parser for R
https://github.com/chrismuir/jsonparse
json r rapidjson rstats
Last synced: about 1 year ago
JSON representation
Fast JSON Parser for R
- Host: GitHub
- URL: https://github.com/chrismuir/jsonparse
- Owner: ChrisMuir
- Created: 2018-10-27T02:15:35.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2018-11-18T06:07:41.000Z (over 7 years ago)
- Last Synced: 2025-04-12T22:05:36.275Z (about 1 year ago)
- Topics: json, r, rapidjson, rstats
- Language: C++
- Size: 38.1 KB
- Stars: 15
- Watchers: 2
- Forks: 2
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
## NOTE
I'm currently working with the [SymbolixAU](https://github.com/SymbolixAU) team to add the code/functionality from this package into their CRAN package [jsonify](https://github.com/SymbolixAU/jsonify). If that all works out as planned, then all future development of this code will be happening in that repo.
# jsonparse
R package for parsing JSON. There are already a few R packages that parse JSON data ( [jsonlite](https://github.com/jeroen/jsonlite), [rjson](https://github.com/alexcb/rjson) ), the intent behind this one is to try to build a package that is faster than the existing options. This project is very young, currently the functions can only handle values of type `int`, `double`, `logical`, and `character`.
This package is built using the [rapidjson](https://github.com/Tencent/rapidjson) C++ library (via the [rapidjsonr](https://github.com/SymbolixAU/rapidjsonr) R package), and [Rcpp](https://github.com/RcppCore/Rcpp).
As an additional resource, check out the [jsonify](https://github.com/SymbolixAU/jsonify) package, which uses the rapidjson library to convert R objects to json.
Please [report](https://github.com/ChrisMuir/jsonparse/issues) issues, comments, or feature requests.
## Installation
Install from this repo:
``` r
# install.packages("devtools")
devtools::install_github("ChrisMuir/jsonparse")
```
## Example Usage
```r
library(jsonparse)
library(jsonify)
```
```r
# Create json string, using package jsonify
json_str <- jsonify::to_json(
list(
"string_key" = "cats",
"int_key" = 5L,
"double_key" = 99.4,
"bool_key" = TRUE,
"vector_key" = c(9L, 10L, 11L, 12L),
"list_key" = list("dogs", 55.3)
)
)
# print json_str
json_str
```
```
#> {"string_key":["cats"],"int_key":[5],"double_key":[99.4],"bool_key":[true],"vector_key":[9,10,11,12],"list_key":[["dogs"],[55.3]]}
```
```r
jsonparse::from_json(json_str)
```
```
#> $string_key
#> [1] "cats"
#> $int_key
#> [1] 5
#> $double_key
#> [1] 99.4
#> $bool_key
#> [1] TRUE
#> $vector_key
#> [1] 9 10 11 12
#> $list_key
#> $list_key[[1]]
#> [1] "dogs"
#> $list_key[[2]]
#> [1] 55.3
```
## Benchmarks
```r
library(jsonlite)
jl_fromJSON <- jsonlite::fromJSON
library(rjson)
rj_fromJSON <- rjson::fromJSON
```
#### Test 1
```r
json_str <- jsonify::to_json(
list(
"ints" = 1L:100000L,
"doubles" = rnorm(100000),
"strings" = stringi::stri_rand_strings(100000, 8),
"bools" = sample(c(TRUE, FALSE), size = 100000, replace = TRUE)
)
)
microbenchmark::microbenchmark(
jsonparse = from_json(json_str),
rjson = rj_fromJSON(json_str),
jsonlite = jl_fromJSON(json_str, simplifyVector = FALSE)
)
```
```
#> Unit: milliseconds
#> expr min lq mean median uq max neval
#> jsonparse 24.01423 27.23423 29.97406 29.60571 32.0372 44.45918 100
#> rjson 100.33898 109.40579 119.47500 117.18489 126.3026 226.08668 100
#> jsonlite 207.57313 219.68605 230.28911 226.09717 239.4743 277.65422 100
```
#### Test 2
```r
json_str <- lapply(1:10000, function(x) {
list(
"string_key" = "cats",
"int_key" = 5L,
"double_key" = 99.4,
"bool_key" = TRUE,
"vector_key" = c(9L, 10L, 11L, 12L),
"list_key" = list("dogs", 55.3)
)
})
json_str <- jsonify::to_json(json_str)
microbenchmark::microbenchmark(
jsonparse = from_json(json_str),
rjson = rj_fromJSON(json_str),
jsonlite = jl_fromJSON(json_str, simplifyVector = FALSE)
)
```
```
#> Unit: milliseconds
#> expr min lq mean median uq max neval
#> jsonparse 15.64111 17.31473 22.00976 19.56679 22.38043 105.1796 100
#> rjson 39.75470 47.17560 57.10193 52.63964 60.26783 168.0407 100
#> jsonlite 106.23252 111.21012 118.63235 115.01797 119.71804 238.5919 100
```