JSON语法

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,是一种结构语言,是常用的APIs格式之一(application programming interfaces)。 语法形式有点像C语言等,主要格式是“firstName”:“John”.

JSON 语法规则

  • JSON 语法是 JavaScript 对象表示语法的子集。
  • 数据在键值对中
  • 数据由逗号分隔
  • 花括号保存对象
  • 方括号保存数组

JSON 名称/值对

JSON 数据的书写格式是:名称/值对。名称/值对组合中的名称写在前面(在双引号中),值 对写在后面(同样在双引号中),中间用冒号隔开:

  • "firstName":"John" 这很容易理解,等价于这条 JavaScript 语句:firstName="John"

  • JSON 值

    + JSON 值可以是:
    + 数字(整数或浮点数)
    + 字符串(在双引号中)
    + 逻辑值(true 或 false)
    + 数组(在方括号中)
    + 对象(在花括号中)
    + null

    示列如下:

{
    "people":[
        {"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"},
        {"firstName":"Jason","lastName":"Hunter","email":"bbbb"},
        {"firstName":"Elliotte","lastName":"Harold","email":"cccc"}
    ]
}

读取JSON例子

jsonlite包

library(knitr)
library(jsonlite)
jsonData <- fromJSON("https://api.github.com/users/jtleek/repos")
class(jsonData)
## [1] "data.frame"
library(pryr)
otype(jsonData)
## [1] "S3"
names(jsonData)
##  [1] "id"                "name"              "full_name"        
##  [4] "owner"             "private"           "html_url"         
##  [7] "description"       "fork"              "url"              
## [10] "forks_url"         "keys_url"          "collaborators_url"
## [13] "teams_url"         "hooks_url"         "issue_events_url" 
## [16] "events_url"        "assignees_url"     "branches_url"     
## [19] "tags_url"          "blobs_url"         "git_tags_url"     
## [22] "git_refs_url"      "trees_url"         "statuses_url"     
## [25] "languages_url"     "stargazers_url"    "contributors_url" 
## [28] "subscribers_url"   "subscription_url"  "commits_url"      
## [31] "git_commits_url"   "comments_url"      "issue_comment_url"
## [34] "contents_url"      "compare_url"       "merges_url"       
## [37] "archive_url"       "downloads_url"     "issues_url"       
## [40] "pulls_url"         "milestones_url"    "notifications_url"
## [43] "labels_url"        "releases_url"      "created_at"       
## [46] "updated_at"        "pushed_at"         "git_url"          
## [49] "ssh_url"           "clone_url"         "svn_url"          
## [52] "homepage"          "size"              "stargazers_count" 
## [55] "watchers_count"    "language"          "has_issues"       
## [58] "has_downloads"     "has_wiki"          "has_pages"        
## [61] "forks_count"       "mirror_url"        "open_issues_count"
## [64] "forks"             "open_issues"       "watchers"         
## [67] "default_branch"
names(jsonData$owner) #jsonData$owner还是一个data.frame
##  [1] "login"               "id"                  "avatar_url"         
##  [4] "gravatar_id"         "url"                 "html_url"           
##  [7] "followers_url"       "following_url"       "gists_url"          
## [10] "starred_url"         "subscriptions_url"   "organizations_url"  
## [13] "repos_url"           "events_url"          "received_events_url"
## [16] "type"                "site_admin"
class(jsonData$owner)
## [1] "data.frame"
jsonData$owner$login
##  [1] "jtleek" "jtleek" "jtleek" "jtleek" "jtleek" "jtleek" "jtleek"
##  [8] "jtleek" "jtleek" "jtleek" "jtleek" "jtleek" "jtleek" "jtleek"
## [15] "jtleek" "jtleek" "jtleek" "jtleek" "jtleek" "jtleek" "jtleek"
## [22] "jtleek" "jtleek" "jtleek" "jtleek" "jtleek" "jtleek" "jtleek"
## [29] "jtleek" "jtleek"

展开嵌套的数据框

flattern(x,recursive = TRUE)

  • x a data frame

  • recursive flatten recursively

class(flatten(jsonData))
df=flatten(jsonData)
str(df)
which(names(df)=="html_url",arr.ind = T)
which(names(jsonData)=="html_url",arr.ind = T)

data.frame与JSON互转

myjson <- toJSON(iris, pretty=TRUE)
#cat(myjson) #输出符合JSON格式的文档
#convert json back to object
iris2 <- fromJSON(myjson)
print(head(iris2))
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa