除了檔案的資料介面,在網際網路中為了方便傳輸資料,資料在傳遞前都會進行序列化(serialize),json、soap、binary和xml都是經常選擇的格式。
常遇到具有REST Api Http服務的資料集提供者,其中json格式大概是目前最常見的選擇,2016這年頭SQL Server也支援json儲存了,未來我們應該有許多機會常和json格式碰到面,今天來複習JSON(JavaScript Object Notation)格式載入。
我們在資料夾MyR新增一支Day13.R
API (application Programming Interface)
這邊我們舉Data.Taipei 臺北市政府資料開放平台api資料中的北捷起訖站點時間作為範例,我們將她載入成DataFrame格式。
#載入jsonlite package
library(jsonlite)
data <- fromJSON("http://data.taipei/opendata/datalist/apiAccess?scope=resourceAquire&rid=55ec6d6e-dc5c-4268-a725-d04cc262172b")
data
載入結後dataframe
資料集描述: 提供臺北捷運文湖線、淡水信義線、松山新店線、中和新蘆線以及板南線之列車進入月台之車站站名、行駛方向等資料。
主要欄位說明: Station(列車進入月台車站站名)、Destination(行駛目的地)、UpdateTime(資料更新時間)
是不是超簡單的!
Data.Taipei 臺北市政府資料開放平台API使用手冊、使用規範及清單可以參閱以下連結:
http://data.taipei/opendata/aboutus
複習完web api了,接著我們來準備兩份. Json檔案 ,並且分別使用兩種json結構(json object及json array)。
Lalaga1.json
{
"Id": [ 1, 2, 3 ],
"NAME": [ "Barcelona", "Real Madird", "Atletico Madrid" ],
"win": [ 29, 28, 28 ],
"draw": [ 4, 6, 4 ],
"lose": [ 5, 4, 6 ],
"Goal": [ 112, 110, 63],
"Pts": [ 91, 90, 88 ]
}
Lalaga2.json
[
{
"Id": 1,
"NAME": "Barcelona",
"win": 29,
"draw": 4,
"lose": 5,
"Goal": 112,
"Pts": 91
},
{
"Id": 2,
"NAME": "Real Madird",
"win": 28,
"draw": 6,
"lose": 4,
"Goal": 110,
"Pts": 90
},
{
"Id": 3,
"NAME": "Atletico Madrid",
"win": 28,
"draw": 4,
"lose": 6,
"Goal": 63,
"Pts": 88
}
]
在Day13.R中輸入程式碼
#載入rjson package
library("rjson")
#載入json檔案1
result <- fromJSON(file = "E:\\XXX\\R\\RTVS-docs-master\\examples\\MyR\\Laliga1.json")
#將json載入到dataframe
json_data_frame <- as.data.frame(result)
#列印dataframe
print(json_data_frame)
執行結果:
由於讀取進來的結構是兩層list,我們需要從json結構中拆解然後轉換成dataframe,這邊會簡單使用到lapply函式。
在Day13.R中輸入程式碼
library("plyr")
library("rjson")
#載入json檔案2
result <- fromJSON(file = "E:\\CyberCArd2\\R\\RTVS-docs-master\\RTVS-docs-master\\examples\\MyR\\Laliga2.json")
dfs <- lapply(result, function(j) {
as.data.frame(j)
})
載入後的result
套lapply先整理成三個list
最後使用rbind
結合成dataframe
#plyr rbind(row bind)
df <- rbind.fill(dfs)
df
執行結果
複習完json格式載入,那麼如果想到dataframe序列化為json格式?
在Day13.R中輸入程式碼
#json object
cat(toJSON(df))
執行結果
#json array
cat(toJSON(unname(alply(df, 1, identity))))
執行結果
這樣我們就可以依照需求轉換為指定的json結構。
一直覺得有一天JSON會統治全世界。
2013-1016法甲冠軍,PSG巴黎聖日耳曼主場
2009-10攝於王子球場,paris,france