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
實際範例
網路上有非常多的開放性資料都是以 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
