R语言转换并保存json文件--使用jsonlite包

钱亦欣 发表于 2017-07-03 00:10   2477 阅读
http://www.ituring.com.cn/article/468152

作者 钱亦欣

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 简单数组
json <- '["Mario", "Peach", null, "Bowser"]'
# 转换为向量
fromJSON(json)[1] "Mario"  "Peach"  NA  "Bowser"

如果把这个参数设置为false,那么就会转换为list。

fromJSON(json, simplifyVector = FALSE)[[1]]
[1] "Mario"
[[2]]
[1] "Peach"
[[3]]
NULL
[[4]]
[1] "Bowser"
  • Data Frame

如果参数为simplifyDataFrame,那么包含对象的JSON数组(key-value pairs)会转化为数据框

json <-
'[{"Name" : "Mario", "Age" : 32, "Occupation" : "Plumber"}, {"Name" : "Peach", "Age" : 21, "Occupation" : "Princess"},{},{"Name" : "Bowser", "Occupation" : "Koopa"}
]'
mydf <- fromJSON(json)
mydfName Age Occupation
1  Mario  32    Plumber
2  Peach  21   Princess
3   <NA>  NA       <NA>
4 Bowser  NA      Koopa

数据框转换JSON只要使用toJSON函数就行(空格和换行符在JSON里可以省略)

mydf$Ranking <- c(3, 1, 2, 4)
toJSON(mydf, pretty=TRUE) # pretty 参数能添加一些空格和换行符是的输出的json更美观[{"Name": "Mario","Age": 32,"Occupation": "Plumber","Ranking": 3},{"Name": "Peach","Age": 21,"Occupation": "Princess","Ranking": 1},{"Ranking": 2},{"Name": "Bowser","Occupation": "Koopa","Ranking": 4}
]
  • Matrices and Arrays

当 simplifyMatrix 参数被使用, 包含登场或者子数组的JSON数组就会变转化为矩阵或者更高阶的R数组:

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

同样地, toJSON()函数可以逆向实现上述过程:

toJSON(mymatrix, 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]]
]'
myarray <- fromJSON(json)
myarray[1, , ][,1] [,2]
[1,]    1    2
[2,]    3    4
myarray[ , ,1][,1] [,2]
[1,]    1    3
[2,]    5    7
[3,]    9   11

3. 修改json

其实R中的json只是包含了特殊属性的字符串而已,利用stringr包中的字符操作函数就能对json进行修改。

# 构建json对象的过程其实就暴露了它是字符串的实质
json <-
'[{"Name" : "Mario", "Age" : 32, "Occupation" : "Plumber"},{"Name" : "Peach", "Age" : 21, "Occupation" : "Princess"}
]'
mydf <- fromJSON(json)
mydf$Ranking <- c(3, 1)
json = toJSON(mydf, pretty = TRUE)
json[{"Name": "Mario","Age": 32,"Occupation": "Plumber","Ranking": 3},{"Name": "Peach","Age": 21,"Occupation": "Princess","Ranking": 1}
]# 查看json对象的类型和存储模式
class(json)
[1] "json"
mode(json)
[1] "character"# 将json对象中的'Ranking'全部替换为'Rank'
library(stringr)
cat(str_replace_all(json, 'Ranking', 'Rank'))[{"Name": "Mario","Age": 32,"Occupation": "Plumber","Rank": 3},{"Name": "Peach","Age": 21,"Occupation": "Princess","Rank": 1}
]# 修改原有的json结构
cat(str_c("{\'newkey\': \'newvalue\',\n \'oldlist\': ",json,'}')){'newkey': 'newvalue','oldlist': [{"Name": "Mario","Age": 32,"Occupation": "Plumber","Ranking": 3},{"Name": "Peach","Age": 21,"Occupation": "Princess","Ranking": 1}
]}

我知道这个方法可能看起来有些怪,但他能达到我们的目的。

4. 保存json文件到本地

如果你使用这个包提供的write_json()函数,那么你保存的文件会包含大量的转义符''\'',而且换行缩进什么的也会以"\n"的符号形式存储。

str(json)Class 'json'  chr "[\n  {\n    \"Name\": \"Mario\",\n    \"Age\": 32,\n    \"Occupation\": \"Plumber\",\n
\"Ranking\": 3\n  },..."| __truncated__

最终包括在文件里的就是这个包含了换行符和转义字符的文件。如果你希望以上面打印出的友好格式来保存json,可以用如下方法

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

cat()函数和dos命令一样,既可以在屏幕上打印文件,也可以保存。当然建立一个connection也可以,这就类似于python里open一个txt,再逐行写入,最后close了。

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

结语

关于R中jsonlite包的功能就分享到这里,与我交流可以直接在下方留言。

R语言转换并保存json文件--使用jsonlite包相关推荐

  1. R语言sink函数保存文件实战

    R语言sink函数保存文件实战 目录 R语言sink函数保存文件实战 #sink函数导出字符串到txt文件

  2. R语言ggplot2可视化保存高分辨率的图片(high resolution)实战

    R语言ggplot2可视化保存高分辨率的图片(high resolution)实战 目录 R语言ggplot2可视化保存高分辨率的图片(high resolution)实战

  3. R语言list.files函数获取文件列表实战

    R语言list.files函数获取文件列表实战 目录 R语言list.files函数获取文件列表实战 #仿真数据 #基本语法

  4. Python保存json文件,英文内容出现乱码

    处理json文件乱码问题 前言 在爬取网页内容是,有的时候会爬取到带有特殊符号的英文名字,如"J. Valančiūnas",但是在保存json文件的时候,会出现乱码的情况. 下图 ...

  5. R语言︱文本挖掘套餐包之——XML+SnowballC+tm包

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- R语言︱文本挖掘套餐包之--XML+tm+Sn ...

  6. R语言处理缺失数据的5个常用包

    R语言处理缺失数据的5个常用包 1.常用缺失数据处理包 2. MICE 包 2.1基本介绍 2.2 实例展示 3.Amelia包 3.1基本介绍 3.2实例展示 4.missForest包 4.1基本 ...

  7. 【R 数据科学】R语言进行数据科学整理最有用的包大全

    一.数据科学工作流程 1.1 数据导入 1.2 数据整理 1.3 反复理解数据 1.4 数据可视化 1.5 数据转换 1.6 统计建模 1.7 作出推断(比如预测) 1.8 沟通交流 1.9 自动化分 ...

  8. R语言使用xgboost构建回归模型:vtreat包为xgboost回归模型进行数据预处理(缺失值填充、缺失值标识、离散变量独热onehot编码)、构建出生体重的xgboost模型回归模型

    R语言使用xgboost构建回归模型:vtreat包为xgboost回归模型进行数据预处理(缺失值填充.缺失值标识.离散变量独热onehot编码).构建出生体重的xgboost模型回归模型 目录

  9. R语言泊松回归(poisson)模型案例:基于robust包的Breslow癫痫数据集

    R语言泊松回归(poisson)模型案例:基于robust包的Breslow癫痫数据集 目录 R语言泊松回归(poisson)模型案例:基于robust包的Breslow癫痫数据集 #数据加载

最新文章

  1. C++ Primer 5th笔记(chap 18 大型程序工具)类型转换与多个基类
  2. 干式真空泵原理_如何安装干式墙锚在墙壁上悬挂重物
  3. PHP水果店管理系统,水果店连锁店管理系统实现一体化功能
  4. 手机是怎么确定位置信息的?
  5. 2010-3-13 社区精英面对面 - 北京 Dev 组 2010 领袖 活动
  6. C语言 Win动态库
  7. MySql(四):备份与恢复
  8. Java设计模式(10)代理模式(Proxy模式)
  9. 1-5Badboy添加检查点和参数化
  10. install java 7 or 8 on ubuntu14
  11. Repast——参数栏实现下拉列表对应不同的功能实现
  12. BUUCTF--[第二章 web进阶]死亡ping命令
  13. 强化学习:Markov Decision Process (基于南大俞扬博士演讲的修改和补充)
  14. ERDAS遥感影像处理-专题图制作
  15. iphone模拟器上模拟内存警告
  16. 15. cookie、session、token
  17. python的urllib.parse用法
  18. 口袋网咖已有服务器在使用怎么注销,口袋网咖进不去怎么办_口袋网咖进不去解决办法...
  19. c语言银行利率问题答案,郑州轻工业大学oj题解(c语言)1016: 银行利率 简单函数的使用...
  20. 做程序员,就是修自己的佛,渡众生的苦--看看散文缓缓心情吧

热门文章

  1. 【转载】oracle normal、sys、system、sysdba、sysoperdba的区别
  2. 艾伟_转载:.NET设计模式:工厂方法模式(Factory Method)
  3. html 环形进度条,详解利用canvas实现环形进度条的方法
  4. 入行||转行软件测试?写给迷惘的你
  5. android 模拟gps坐标,1020. Android GPS定位欺骗(模拟定位)的3类途径4种方式
  6. 亲密关系-【认知情绪】-每一次生气的背后有什么
  7. 亲密关系-【沟通提示】-如何把学习到的东西用到生活中
  8. rest功能java,java – 功能翻转REST端点的注释
  9. Linux把日志文件转换成xml,[转载]将 HTML 文件转换成 XML
  10. 华为手机上的网上邻居怎么用_只要华为手机用上鸿蒙OS2.0,刚买的手机我也马上换!...