【原創】R語言轉換並保存json文件--使用jsonlite包

作者 錢亦欣

json是當下非常流行的數據交換格式,有著簡單易用,易讀(人和機器都容易)等特點。目前挺流行的非關係型資料庫MongoDB就可以簡單理解為一個json的容器,同時mysql(5.7以上版本),postgresql等關係型資料庫也開始支持這一數據結構。因此,掌握關於json的一些知識很有必要,你可以訪問它的官網來了解它的結構和在各種編程語言中的相應的庫。

當然,身為一個統計專業的學生,我們接觸到的數據很多時候還是結構化的DataFrame格式,如果你想把這一格式的存儲轉換為json格式,我在這裡給大家推薦一個很好用的包--jsonlite。

jsonlite是專門用來轉換,讀取和保存json文件的R包,按照作者的描述,它提供了json和R中常用數據類型的雙向轉換功能,高效、簡潔而且穩定。根據我的使用體驗,也確實如此。閑言少敘,讓我們進入正題。

1. 讀取json文件

json文件的讀取可以用read_json()函數實現,這個函數的第二個參數 simplifyVector 如果設置為TRUE,則json結構會被簡化為向量,FALSE則會變為列表

2. json結構和R中原生數據結構的相互轉換

(1)jsonlite包中的fromJSON函數就是把json結構的數據轉換為R中常見數據類型的工具。與之相反,toJSON函數則是把R中原生的數據結構轉變為json。具體的參數設定和二者的結構對應關係如下:

Atomic Vectors 我們來展開港一港:

  • 如果你的JSON結構本身就是一個簡單的數組,那麼用simplifyVector參數就能把它直接轉換為向量

    # JSON 簡單數組njson <- ["Mario", "Peach", null, "Bowser"]n# 轉換為向量nfromJSON(json)nn[1] "Mario" "Peach" NA "Bowser"n

    如果把這個參數設置為false,那麼就會轉換為list。

    fromJSON(json, simplifyVector = FALSE)nn[[1]]n[1] "Mario"n[[2]]n[1] "Peach"n[[3]]nNULLn[[4]]n[1] "Bowser"n

  • Data Frame

    如果擦書為simplifyDataFrame,那麼包含對象的JSON數組(key-value pairs)會轉化為數據框

    json <-n[n {"Name" : "Mario", "Age" : 32, "Occupation" : "Plumber"}, n {"Name" : "Peach", "Age" : 21, "Occupation" : "Princess"},n {},n {"Name" : "Bowser", "Occupation" : "Koopa"}n]nmydf <- fromJSON(json)nmydfnn Name Age Occupationn1 Mario 32 Plumbern2 Peach 21 Princessn3 <NA> NA <NA>n4 Bowser NA Koopan

    數據框轉換JSON只要使用toJSON函數就行(空格和換行符在JSON里可以省略)

    mydf$Ranking <- c(3, 1, 2, 4)ntoJSON(mydf, pretty=TRUE) # pretty 參數能添加一些空格和換行符是的輸出的json更美觀nn[n {n "Name": "Mario",n "Age": 32,n "Occupation": "Plumber",n "Ranking": 3n },n {n "Name": "Peach",n "Age": 21,n "Occupation": "Princess",n "Ranking": 1n },n {n "Ranking": 2n },n {n "Name": "Bowser",n "Occupation": "Koopa",n "Ranking": 4n }n] n

  • Matrices and Arrays

    當 simplifyMatrix 參數被使用, 包含登場或者子數組的JSON數組就會變轉化為矩陣或者更高階的R數組:

    json <- [n [1, 2, 3, 4],n [5, 6, 7, 8],n [9, 10, 11, 12]n]nmymatrix <- fromJSON(json)nmymatrixnn [,1] [,2] [,3] [,4]n[1,] 1 2 3 4n[2,] 5 6 7 8n[3,] 9 10 11 12n

    同樣地, toJSON()函數可以逆向實現上述過程:

    toJSON(mymatrix, pretty = TRUE)nn[n [1, 2, 3, 4],n [5, 6, 7, 8],n [9, 10, 11, 12]n] n

    只要數組的維數對應,就能很容易的把json簡化為R中的多維數組

    json <- [n [[1, 2], n [3, 4]],n [[5, 6], n [7, 8]],n [[9, 10],n [11, 12]]n]nmyarray <- fromJSON(json)nmyarray[1, , ]nn [,1] [,2]n[1,] 1 2n[2,] 3 4nmyarray[ , ,1]n [,1] [,2]n[1,] 1 3n[2,] 5 7n[3,] 9 11n

    3. 修改json

    其實R中的json只是包含了特殊屬性的字元串而已,利用stringr包中的字元操作函數就能對json進行修改。

    # 構建json對象的過程其實就暴露了它是字元串的實質njson <- n[n {"Name" : "Mario", "Age" : 32, "Occupation" : "Plumber"},n {"Name" : "Peach", "Age" : 21, "Occupation" : "Princess"}n]nmydf <- fromJSON(json)nmydf$Ranking <- c(3, 1)njson = toJSON(mydf, pretty = TRUE)njsonnn[n {n "Name": "Mario",n "Age": 32,n "Occupation": "Plumber",n "Ranking": 3n },n {n "Name": "Peach",n "Age": 21,n "Occupation": "Princess",n "Ranking": 1n }n]nn# 查看json對象的類型和存儲模式nclass(json)n[1] "json"nmode(json)n[1] "character"nn# 將json對象中的Ranking全部替換為Ranknlibrary(stringr)ncat(str_replace_all(json, Ranking, Rank))nn[n {n "Name": "Mario",n "Age": 32,n "Occupation": "Plumber",n "Rank": 3n },n {n "Name": "Peach",n "Age": 21,n "Occupation": "Princess",n "Rank": 1n }n]nn# 修改原有的json結構ncat(str_c("{newkey: newvalue,n oldlist: ",json,}))nn{newkey: newvalue,n oldlist: [n {n "Name": "Mario",n "Age": 32,n "Occupation": "Plumber",n "Ranking": 3n },n {n "Name": "Peach",n "Age": 21,n "Occupation": "Princess",n "Ranking": 1n }n]}n

    我知道這個方法可能看起來有些怪,但他能達到我們的目的。

    4. 保存json文件到本地

    如果你使用這個包提供的write_json()函數,那麼你保存的文件會包含大量的轉義符,而且換行縮進什麼的也會以"n"的符號形式存儲。

    str(json)nnClass json chr "[n {n "Name": "Mario",n "Age": 32,n "Occupation": "Plumber",nn "Ranking": 3n },..."| __truncated__n

    最終包括在文件里的就是這個包含了換行符和轉義字元的文件。如果你希望以上面列印出的友好格式來保存json,可以用如下方法

    cat(json, file = json.txt, fill = FALSE, labels = NULL, append = FALSE)n

    cat()函數和dos命令一樣,既可以在屏幕上列印文件,也可以保存。當然建立一個connection也可以,這就類似於python里open一個txt,再逐行寫入,最後close了。

    cat(json, file = (con <- file(json.txt, "w", encoding = "UTF-8")))nclose(con)n

    結語

    關於R中jsonlite包的功能就分享到這裡,與我交流可以直接在下方留言。

推薦閱讀:

json 在 Python 爬蟲的應用
XML/HTML/JSON——數據抓取過程中不得不知的幾個概念
一捅到底的架構
Bumpover.js - 牢固而趁手的數據校驗轉換庫

TAG:JSON | R编程语言 |