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

接下來要介紹實際的範例,請繼續閱讀下一頁。