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