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 FramesimplifyDataFrame
二維陣列[ [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

實際範例

網路上有非常多的開放性資料都是以 JSON 格式提供下載的,其實不管是什麼類型的資料,使用 jsonlite 來下載的方法都完全相同,只要將 JSON 網址複製下來,再透過 fromJSON 抓下來即可,而後續的處理與分析就要看資料的內容而定了。

以下是幾個從 R 中使用 jsonlite 套件直接下載網路 JSON 資料的範例。

政府資料開放平台

政府資料開放平台上面有許多可以直接下載的資料,支援 JSON 格式下載的資料非常多,我們拿紫外線即時監測資料來做示範。

首先從政府資料開放平台的網頁中,查詢 JSON 資料的下載網址,把網址複製下來:

# 紫外線即時監測 JSON 資料網址
url <- "http://opendata.epa.gov.tw/ws/Data/UV/?format=json"

使用 fromJSON 直接下載 JSON 檔:

# 使用 jsonlite 下載 JSON 資料
my.data <- fromJSON(url)

這樣抓下來之後,就可以直接在 R 中使用了:

# 查看資料
head(my.data)
SiteName   UVI PublishAgency County  WGS84Lon WGS84Lat      PublishTime
1     花蓮 10.81    中央氣象局 花蓮縣 121,36,48 23,58,30 2017-07-06 14:00
2     馬祖  8.84    中央氣象局 連江縣 119,55,24 26,10,09 2017-07-06 14:00
3     高雄  5.88    中央氣象局 高雄市 120,18,57 22,33,58 2017-07-06 14:00
4     玉山  7.94    中央氣象局 南投縣 120,57,34 23,29,15 2017-07-06 14:00
5     臺南  8.81    中央氣象局 臺南市 120,12,17 22,59,36 2017-07-06 14:00
6     新竹  8.50    中央氣象局 新竹縣 121,00,51 24,49,40 2017-07-06 14:00

內政資料開放平臺

內政資料開放平臺的各縣市統計區人口統計資料包含台灣各地區的人口統計數據,包含戶數、人口數、男性人口數、女性人口數等。

# 新竹縣統計區人口統計 JSON 網址
url <- "http://data.moi.gov.tw/MoiOD/System/DownloadFile.aspx?DATA=62571BAA-CA7C-448E-80D5-40C1303B9C3B"

# 使用 jsonlite 下載 JSON 資料
my.data <- fromJSON(url)

# 查看資料
head(my.data)
$Info
  InMetaDatCode InSTUnitCode InCountyId OutTotal
1    3A1FA_A1C2        U0202      10004      184

$ColumnList
  COLUMN_NAME DATA_TYPE    COLUMN_DESC DISPLAY_UNIT
1   INFO_TIME      文字       資料時間         <NA>
2       CODE2      文字 二級發布區代碼
3       H_CNT      數值           戶數           戶
4       P_CNT      數值         人口數           人
5       M_CNT      數值     男性人口數           人
6       F_CNT      數值     女性人口數           人

$RowDataList
    PRODUCT_ID INFO_TIME    CODE2 H_CNT P_CNT M_CNT F_CNT
1        99440   105Y12M A0405-05   985  2951  1409  1542
2        99440   105Y12M A0405-06     1     1     0     1
3        99440   105Y12M A0405-07  1121  3080  1576  1504
4        99440   105Y12M A0405-08   862  2720  1354  1366
5        99440   105Y12M A0405-09   956  3084  1521  1563
6        99440   105Y12M A0405-10   871  2741  1387  1354
[略]

行政院環境保護署 環境資源資料開放平台

這是行政院環境保護署環境資源資料開放平台的大甲媽祖遶境即時空品監測成果 JSON 資料下載範例。

# 大甲媽祖遶境即時空品監測成果 JSON 網址
url <- "http://opendata.epa.gov.tw/ws/Data/ATM00544/?$skip=0&$top=1000&format=json"

# 使用 jsonlite 下載 JSON 資料
my.data <- fromJSON(url)

# 查看資料
head(my.data)
MachineKey temp humi pm25 pm25Level        lat         lng                gps_time
1       TP02   26   86   45         5 24.3491473 120.6170552 2016/4/17 下午 08:12:00
2       TP02   26   86   45         5 24.3491471 120.6170549 2016/4/17 下午 08:12:00
3       TP02   25   83   49         6 24.3491415 120.6170257 2016/4/17 下午 08:10:00
4       TP02   25   79   30         3 24.3491893 120.6170386 2016/4/17 下午 08:09:00
5       TP02   26   95   32         3  24.349189 120.6170382 2016/4/17 下午 08:08:00
6       TP03   25   91   59         8 24.3491511 120.6170786 2016/4/17 下午 08:08:00