如何将数据合并到R中预先存在的JSON结构中?

第一次海报,长时间潜伏.要温柔.中等R用户.我确信有一种更好的,功能性的方式来做我需要的,但感觉我已经研究了没有洞察力的死亡.

我正在尝试将数据集合并到预先存在的JSON结构中.每个JSON结构的一行记录,用于许多序列化JSON请求.

我将数据集加载到13个变量的数据,并更改列标题以匹配它们在JSON结构中的显示方式

library(jsonlite)
#### Map Column headers to their respective names in the JSON Structure
colnames(data) <- c("default.A","default.B","default.C","items.A","items.B.1","items.B.2","items.B.3","items.B.4",)

创建空白JSON结构.这是需要处理JSON请求的格式.简单的嵌套结构.

sample <- '{
      "default": {
           "A": "","B": "","C": "",},"items": [{
           "A": "","B": {
                "1": "","2": "","3": "","4": "",}
                }]
           }'

jsonstructure <- fromJSON(sample)

将一切都设为DF.合并他们.用空白填充NA

x <- as.data.frame(data)
y <- as.data.frame(jsonstructure)
Z <- merge(x,y,all = TRUE)
Z[is.na(Z)] <- ""

转换为JSON

jsonZ <- toJSON(unname(split(Z,1:nrow(Z))),pretty=TRUE)
cat(jsonZ)

电流输出不匹配

[
  [
    {
   "default.A": "","default.B": "1234567890","default.C": "","items.A": "1234567890","items.B.1": "1234","items.B.2": "1234","items.B.3": "1234","items.B.4": "1234",}
  ],[
    {
   "default.A": "","default.B": "0987654321","items.A": "0987654321","items.B.1": "4321","items.B.2": "4321","items.B.3": "4321","items.B.4": "4321",}
  ]
]

解决方法

无法重现您的结果 – 但这是我对您想要实现的目标的猜测.请参阅注释以获取有关代码的帮助.

library(jsonlite)

#data.frame with data - you have probably more than 2 rows
data=data.frame(rbind(t(c(NA,1234567890,NA,1234,1234)),t(c(1,2,3,1,1000,1234))))

cn=c("default.A","items.B.4")

colnames(data)=cn

#assuming that "." represents structure
mapping=strsplit(cn,"\\.")

#template JSON
jsonstructure <- fromJSON('{"default": {"A": "","C": ""},"items": [{"A": "","B": {"1": "","4": ""}}]}')

#Now loop through all rows in your data.frame and store them in JSON format
#this will give you a list with JSON objects (i.e.,a list of lists)
json_list=lapply(split(data,1:nrow(data)),function(data_row) {
  for (i in seq_along(mapping)) jsonstructure[[mapping[[i]]]]<-data_row[,cn[i]]
  jsonstructure
})

结果:

toJSON(json_list[[2]],pretty = TRUE,auto_unBox=TRUE)
#{
#  "default": {
#    "A": 1,#    "B": "NA",#    "C": 2
#  },#  "items": [
#    {
#      "A": 3,#      "B": {
#        "1": 1,#        "2": 1000,#        "4": 1234
#      }
#    }
#  ]
#}

只是另一个评论.我的方法使用列表的递归子集,如[运算符的帮助中所述:

[[ can be applied recursively to lists,so that if the single index i is a vector of length p,alist[[i]] is equivalent to alist[[i1]]…[[ip]] providing all but the final indexing results in a list.

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...