jsonlite 是 R 的一個 JSON 格式資料處理套件,本篇介紹此套件的基本用法,並提供實際應用的範例。
JSON(JavaScript Object Notation)是一種輕量級的資料交換格式,屬於 JavaScript 語言的子集,實作上相當容易,在網路上許多資料都會使用 JSON 的格式來傳遞。
jsonlite 套件
在 R 中若要讀取或是產生 JSON 格式的資料,可以使用 jsonlite 這個 R 的套件,此套件屬於 R 官方收錄的套件之一,可用 install.packages 直接安裝:
install.packages("jsonlite")
安裝完成後,載入套件:
library(jsonlite)
JSON 與 R 物件轉換
jsonlite 套件是專門為了網路資料傳遞所設計的 JSON 解析器與產生器,其提供了 R 物件與 JSON 資料格式之間雙向轉換的功能,而且在轉換之後,可以保留 R 物件完整的資料與屬性。
# 將 mtcars 這個 data frame 轉為 JSON 資料格式 my.json <- toJSON(mtcars) # 將 JSON 資料格式轉為 data frame my.df <- fromJSON(my.json) # 檢查轉換後的資料是否一致 all.equal(mtcars, my.df)
[1] TRUE
下表是各種 R 物件與 JSON 結構之謙的對應關係:
| JSON 格式 | 範例 | 對應的 R 物件 | FROMJSON 參數 |
|---|---|---|---|
| 陣列 | ["Amsterdam", "Rotterdam", "Utrecht", "Den Haag"] |
向量 | simplifyVector |
| 物件陣列 | [{"name":"Erik", "age":43}, {"name":"Anna", "age":32}] |
Data Frame | simplifyDataFrame |
| 二維陣列 | [ [1, 2, 3], [4, 5, 6] ] |
矩陣 | simplifyMatrix |
向量
在預設的情況下,fromJSON 會將包含基本資料類型(字串、數值、布林值或 null)的 JSON 陣列,轉換為 R 的向量:
json <- '["Mario", "Peach", null, "Bowser"]' fromJSON(json)
[1] "Mario" "Peach" NA "Bowser"
如果將 simplifyVector 設定為 FALSE,則 fromJSON 就會維持最原始的 JSON 資料結構,也就是把資料轉為 R 的列表變數(list):
fromJSON(json, simplifyVector = FALSE)
[[1]] [1] "Mario" [[2]] [1] "Peach" [[3]] NULL [[4]] [1] "Bowser"
Data Frame
當 fromJSON 遇到含有多個物件的 JSON 資料時,預設會將其轉換為 R 的 data frame,例如:
json <- '[ {"Name" : "Mario", "Age" : 32, "Occupation" : "Plumber"}, {"Name" : "Peach", "Age" : 21, "Occupation" : "Princess"}, {}, {"Name" : "Bowser", "Occupation" : "Koopa"} ]' (my.df <- fromJSON(json))
Name Age Occupation 1 Mario 32 Plumber 2 Peach 21 Princess 3 <NA> NA <NA> 4 Bowser NA Koopa
我們可以將轉換出來的 data frame 任意修改後,再透過 toJSON 函數轉換回 JSON 格式,例如在這個 data frame 中多加上一欄 Ranking 的資料:
my.df$Ranking <- c(3, 1, 2, 4)
然後再轉為 JSON:
toJSON(my.df, pretty = TRUE)
[
{
"Name": "Mario",
"Age": 32,
"Occupation": "Plumber",
"Ranking": 3
},
{
"Name": "Peach",
"Age": 21,
"Occupation": "Princess",
"Ranking": 1
},
{
"Ranking": 2
},
{
"Name": "Bowser",
"Occupation": "Koopa",
"Ranking": 4
}
]
矩陣與陣列
fromJSON 遇到包含二維陣列的 JSON 資料時,預設會轉換為 R 的矩陣:
json <- '[ [1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12] ]' (my.matrix <- fromJSON(json))
[,1] [,2] [,3] [,4] [1,] 1 2 3 4 [2,] 5 6 7 8 [3,] 9 10 11 12
同樣地我們可以使用 toJSON 將 R 矩陣轉為 JSON:
toJSON(my.matrix, pretty = TRUE)
[ [1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12] ]
高維度的 JSON 陣列也是以類似的方式轉換為 R 的陣列:
json <- '[ [[1, 2], [3, 4]], [[5, 6], [7, 8]], [[9, 10], [11, 12]] ]' my.array <- fromJSON(json) my.array[1, , ]
[,1] [,2] [1,] 1 2 [2,] 3 4
接下來要介紹實際的範例,請繼續閱讀下一頁。
繼續閱讀: 12