jsonlite: A Robust, High Performance JSON Parser and Generator for R

JSONファイルを取り扱うためのパッケージ

> 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"