jsonlite: A Robust, High Performance JSON Parser and Generator for R
JSONファイルを取り扱うためのパッケージ
- CRAN: http://cran.r-project.org/web/packages/jsonlite/index.html
- GitHub: http://github.com/jeroenooms/jsonlite
- URL: http://arxiv.org/abs/1403.2805, https://www.opencpu.org/posts/jsonlite-a-smarter-json-encoder
- vignettes:
> library(jsonlite)
バージョン: 1.1
関数名 | 概略 |
---|---|
flatten |
Flatten nested data frames |
prettify, minify |
Prettify or minify a JSON string |
rbind.pages |
Combine pages into a single data frame |
serializeJSON |
serialize R objects to JSON |
stream_in, stream_out |
Streaming JSON input/output |
toJSON, fromJSON |
Convert R objects to/from JSON |
unbox |
Unbox a vector or data frame |
validate |
Validate JSON |
flatten
階層構造のあるデータフレームを2次元のデータフレームとして扱う
ref) purrr::flatten
Arguments
- x... 対象のデータフレーム
- recursive...
> x <- dplyr::data_frame(driver = c("Bowser", "Peach"), occupation = c("Koopa", "Princess"))
> x$vehicle <- dplyr::data_frame(model = c("Piranha Prowler", "Royal Racer"))
> x$vehicle$stats <- dplyr::data_frame(speed = c(55, 34), weight = c(67, 24), drift = c(35, 32))
> str(x)
Classes 'tbl_df', 'tbl' and 'data.frame': 2 obs. of 3 variables:
$ driver : chr "Bowser" "Peach"
$ occupation: chr "Koopa" "Princess"
$ vehicle :Classes 'tbl_df', 'tbl' and 'data.frame': 2 obs. of 2 variables:
..$ model: chr "Piranha Prowler" "Royal Racer"
..$ stats:Classes 'tbl_df', 'tbl' and 'data.frame': 2 obs. of 3 variables:
.. ..$ speed : num 55 34
.. ..$ weight: num 67 24
.. ..$ drift : num 35 32
> x %>% flatten(recursive = TRUE) %>% str()
Error in flatten(., recursive = TRUE): unused argument (recursive = TRUE)
prettify / minify
JSON構文の出力形式の変更
Arguments
- txt
- indent
> cars %>% toJSON() %>% prettify(indent = 4)
{
"speed": [
4,
4,
7,
7,
8,
9,
10,
10,
10,
11,
11,
12,
12,
12,
12,
13,
13,
13,
13,
14,
14,
14,
14,
15,
15,
15,
16,
16,
17,
17,
17,
18,
18,
18,
18,
19,
19,
19,
20,
20,
20,
20,
20,
22,
23,
24,
24,
24,
24,
25
],
"dist": [
2,
10,
4,
22,
16,
10,
18,
26,
34,
17,
28,
14,
20,
24,
28,
26,
34,
34,
46,
26,
36,
60,
80,
20,
26,
54,
32,
40,
32,
40,
50,
42,
56,
76,
84,
36,
46,
68,
32,
48,
52,
56,
64,
66,
54,
70,
92,
93,
120,
85
]
}
> cars %>% toJSON() %>% minify()
{"speed":[4,4,7,7,8,9,10,10,10,11,11,12,12,12,12,13,13,13,13,14,14,14,14,15,15,15,16,16,17,17,17,18,18,18,18,19,19,19,20,20,20,20,20,22,23,24,24,24,24,25],"dist":[2,10,4,22,16,10,18,26,34,17,28,14,20,24,28,26,34,34,46,26,36,60,80,20,26,54,32,40,32,40,50,42,56,76,84,36,46,68,32,48,52,56,64,66,54,70,92,93,120,85]}
rbind.pages
リストオブジェクトを結合してデータフレームとして返す
> x <- data.frame(foo = rnorm(3), bar = c(TRUE, FALSE, TRUE))
> y <- data.frame(foo = rnorm(2), col = c("blue", "red"))
> rbind.pages(list(x, y))
foo bar col
1 0.2387317 TRUE <NA>
2 -0.6279061 FALSE <NA>
3 1.3606524 TRUE <NA>
4 -0.6002596 NA blue
5 2.1873330 NA red
serializeJSON / unserializeJSON
> serializeJSON(mtcars)
[1] "{\"type\":\"list\",\"attributes\":{\"names\":{\"type\":\"character\",\"attributes\":{},\"value\":[\"mpg\",\"cyl\",\"disp\",\"hp\",\"drat\",\"wt\",\"qsec\",\"vs\",\"am\",\"gear\",\"carb\"]},\"row.names\":{\"type\":\"character\",\"attributes\":{},\"value\":[\"Mazda RX4\",\"Mazda RX4 Wag\",\"Datsun 710\",\"Hornet 4 Drive\",\"Hornet Sportabout\",\"Valiant\",\"Duster 360\",\"Merc 240D\",\"Merc 230\",\"Merc 280\",\"Merc 280C\",\"Merc 450SE\",\"Merc 450SL\",\"Merc 450SLC\",\"Cadillac Fleetwood\",\"Lincoln Continental\",\"Chrysler Imperial\",\"Fiat 128\",\"Honda Civic\",\"Toyota Corolla\",\"Toyota Corona\",\"Dodge Challenger\",\"AMC Javelin\",\"Camaro Z28\",\"Pontiac Firebird\",\"Fiat X1-9\",\"Porsche 914-2\",\"Lotus Europa\",\"Ford Pantera L\",\"Ferrari Dino\",\"Maserati Bora\",\"Volvo 142E\"]},\"class\":{\"type\":\"character\",\"attributes\":{},\"value\":[\"data.frame\"]}},\"value\":[{\"type\":\"double\",\"attributes\":{},\"value\":[21,21,22.8,21.4,18.7,18.1,14.3,24.4,22.8,19.2,17.8,16.4,17.3,15.2,10.4,10.4,14.7,32.4,30.4,33.9,21.5,15.5,15.2,13.3,19.2,27.3,26,30.4,15.8,19.7,15,21.4]},{\"type\":\"double\",\"attributes\":{},\"value\":[6,6,4,6,8,6,8,4,4,6,6,8,8,8,8,8,8,4,4,4,4,8,8,8,8,4,4,4,8,6,8,4]},{\"type\":\"double\",\"attributes\":{},\"value\":[160,160,108,258,360,225,360,146.7,140.8,167.6,167.6,275.8,275.8,275.8,472,460,440,78.7,75.7,71.1,120.1,318,304,350,400,79,120.3,95.1,351,145,301,121]},{\"type\":\"double\",\"attributes\":{},\"value\":[110,110,93,110,175,105,245,62,95,123,123,180,180,180,205,215,230,66,52,65,97,150,150,245,175,66,91,113,264,175,335,109]},{\"type\":\"double\",\"attributes\":{},\"value\":[3.9,3.9,3.85,3.08,3.15,2.76,3.21,3.69,3.92,3.92,3.92,3.07,3.07,3.07,2.93,3,3.23,4.08,4.93,4.22,3.7,2.76,3.15,3.73,3.08,4.08,4.43,3.77,4.22,3.62,3.54,4.11]},{\"type\":\"double\",\"attributes\":{},\"value\":[2.62,2.875,2.32,3.215,3.44,3.46,3.57,3.19,3.15,3.44,3.44,4.07,3.73,3.78,5.25,5.424,5.345,2.2,1.615,1.835,2.465,3.52,3.435,3.84,3.845,1.935,2.14,1.513,3.17,2.77,3.57,2.78]},{\"type\":\"double\",\"attributes\":{},\"value\":[16.46,17.02,18.61,19.44,17.02,20.22,15.84,20,22.9,18.3,18.9,17.4,17.6,18,17.98,17.82,17.42,19.47,18.52,19.9,20.01,16.87,17.3,15.41,17.05,18.9,16.7,16.9,14.5,15.5,14.6,18.6]},{\"type\":\"double\",\"attributes\":{},\"value\":[0,0,1,1,0,1,0,1,1,1,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1,0,1,0,0,0,1]},{\"type\":\"double\",\"attributes\":{},\"value\":[1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1]},{\"type\":\"double\",\"attributes\":{},\"value\":[4,4,4,3,3,3,3,4,4,4,4,3,3,3,3,3,3,4,4,4,3,3,3,3,3,4,5,5,5,5,5,4]},{\"type\":\"double\",\"attributes\":{},\"value\":[4,4,1,1,2,1,4,2,2,4,4,3,3,3,4,4,4,1,2,1,1,2,2,4,2,1,2,2,4,6,8,2]}]}"
> serializeJSON(mtcars) %>% unserializeJSON()
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4
Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3
Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4
Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4
Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4
Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2
AMC Javelin 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2
Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4
Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2
Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4
Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6
Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8
Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
> identical(mtcars, serializeJSON(mtcars) %>% unserializeJSON())
[1] TRUE
stream_in / stream_out
Arguments
- con
- handler
- pagesize
- verbose
- ...
- x
> mydata <- url("http://httpbin.org/stream/100") %>% stream_in()
opening url input connection.
Found 100 records...
Imported 100 records. Simplifying...
closing url input connection.
> diamonds2 <- url("http://jeroenooms.github.io/data/diamonds.json") %>% stream_in()
opening url input connection.
Found 500 records...
Found 1000 records...
Found 1500 records...
Found 2000 records...
Found 2500 records...
Found 3000 records...
Found 3500 records...
Found 4000 records...
Found 4500 records...
Found 5000 records...
Found 5500 records...
Found 6000 records...
Found 6500 records...
Found 7000 records...
Found 7500 records...
Found 8000 records...
Found 8500 records...
Found 9000 records...
Found 9500 records...
Found 10000 records...
Found 10500 records...
Found 11000 records...
Found 11500 records...
Found 12000 records...
Found 12500 records...
Found 13000 records...
Found 13500 records...
Found 14000 records...
Found 14500 records...
Found 15000 records...
Found 15500 records...
Found 16000 records...
Found 16500 records...
Found 17000 records...
Found 17500 records...
Found 18000 records...
Found 18500 records...
Found 19000 records...
Found 19500 records...
Found 20000 records...
Found 20500 records...
Found 21000 records...
Found 21500 records...
Found 22000 records...
Found 22500 records...
Found 23000 records...
Found 23500 records...
Found 24000 records...
Found 24500 records...
Found 25000 records...
Found 25500 records...
Found 26000 records...
Found 26500 records...
Found 27000 records...
Found 27500 records...
Found 28000 records...
Found 28500 records...
Found 29000 records...
Found 29500 records...
Found 30000 records...
Found 30500 records...
Found 31000 records...
Found 31500 records...
Found 32000 records...
Found 32500 records...
Found 33000 records...
Found 33500 records...
Found 34000 records...
Found 34500 records...
Found 35000 records...
Found 35500 records...
Found 36000 records...
Found 36500 records...
Found 37000 records...
Found 37500 records...
Found 38000 records...
Found 38500 records...
Found 39000 records...
Found 39500 records...
Found 40000 records...
Found 40500 records...
Found 41000 records...
Found 41500 records...
Found 42000 records...
Found 42500 records...
Found 43000 records...
Found 43500 records...
Found 44000 records...
Found 44500 records...
Found 45000 records...
Found 45500 records...
Found 46000 records...
Found 46500 records...
Found 47000 records...
Found 47500 records...
Found 48000 records...
Found 48500 records...
Found 49000 records...
Found 49500 records...
Found 50000 records...
Found 50500 records...
Found 51000 records...
Found 51500 records...
Found 52000 records...
Found 52500 records...
Found 53000 records...
Found 53500 records...
Found 53940 records...
Imported 53940 records. Simplifying...
closing url input connection.
> dim(diamonds2)
[1] 53940 10
toJSON / fromJSON
RオブジェクトとJSON形式への入出力
ref) rjson::fromJSON()
, RJSONIO::fromJSON()
, rjson::toJSON()
, RJSONIO::toJSON()
Arguments
- txt
- simplifyVector
- simplifyDataFrame
- simplifyMatrix
- flatten...
- ...
- x
- dataframe
- matrix
- Date
- POSIXt
- factor
- complex
- raw
- null
- na
- auto_unbox
- digits
- pretty
- force
> cars %>% toJSON()
[1] "{\n \"speed\": [ 4, 4, 7, 7, 8, 9, 10, 10, 10, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 16, 16, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 20, 20, 20, 20, 20, 22, 23, 24, 24, 24, 24, 25 ],\n\"dist\": [ 2, 10, 4, 22, 16, 10, 18, 26, 34, 17, 28, 14, 20, 24, 28, 26, 34, 34, 46, 26, 36, 60, 80, 20, 26, 54, 32, 40, 32, 40, 50, 42, 56, 76, 84, 36, 46, 68, 32, 48, 52, 56, 64, 66, 54, 70, 92, 93, 120, 85 ] \n}"
> d_json <- fromJSON(txt = "https://api.github.com/users/uribo/repos")
Error in (function (classes, fdef, mtable) : unable to find an inherited method for function 'fromJSON' for signature '"missing", "missing"'
> d_json %>% {
+ flatten(.) %>% names() %>% print()
+ str(., max.level = 1)
+ }
Error in eval(expr, envir, enclos): object 'd_json' not found
unbox
> toJSON(list(foo=123))
[1] "{\n \"foo\": 123 \n}"
> toJSON(list(foo=unbox(123)))
[1] "{\n \"foo\": 123 \n}"
> (x = list(x=1:3, y = 4, z = "foo", k = NULL))
$x
[1] 1 2 3
$y
[1] 4
$z
[1] "foo"
$k
NULL
> toJSON(x)
[1] "{\n \"x\": [ 1, 2, 3 ],\n\"y\": 4,\n\"z\": \"foo\",\n\"k\": null \n}"
> toJSON(x, auto_unbox = TRUE)
[1] "{\n \"x\": [ 1, 2, 3 ],\n\"y\": 4,\n\"z\": \"foo\",\n\"k\": null \n}"
validate
jsonクラスオブジェクトの検証
ref) RJSONIO::isValidJSON()
> toJSON(mtcars) %>% validate()
[1] TRUE
> '{"age": 23}' %>% validate()
[1] TRUE
> '{age: 23}' %>% validate()
[1] FALSE
attr(,"offset")
[1] 2
attr(,"err")
[1] "lexical error: invalid char in json text.\n {age: 23}\n (right here) ------^\n"