如何将数据合并到 R 中的 pre-existing JSON 结构中?
How to merge data in to a pre-existing JSON structure in R?
第一次发帖,长期潜伏。要温柔。中度 R 用户。我确信有更好、更实用的方法来做我需要的事情,但我觉得我已经研究过没有洞察力的死亡。
我正在尝试将数据集合并到 pre-existing JSON 结构中。对于许多序列化的 JSON 请求,每个 JSON 结构的一行记录。
我将数据集加载到包含 13 个变量的数据中,并更改列 headers 以匹配它们在 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",
"default.C": "",
"items.A": "0987654321",
"items.B.1": "4321",
"items.B.2": "4321",
"items.B.3": "4321",
"items.B.4": "4321",
}
]
]
如果你对 jsonlite 包没有死心塌地,你可以试试 rjson 包
library(rjson)
value = c("", "1234690","")
names(value) = c("A","B","C")
value2 = c("","0987654321","","0987654321")
names(value2) = c("1","2","3","4")
test <- toJSON(list( "default" = value, "items" = list(c("A" = "", "B" = list(value2))) ))
cat(test)
writeLines(test, "test.json")
无法重现您的结果 - 但这是我对您想要实现的目标的猜测。请参阅评论以获取有关代码的帮助。
library(jsonlite)
#data.frame with data - you have probably more than 2 rows
data=data.frame(rbind(t(c(NA,1234567890,NA,1234567890,1234,1234,1234,1234)),
t(c(1,NA,2,3,1,1000,NA,1234))))
cn=c("default.A",
"default.B",
"default.C",
"items.A",
"items.B.1",
"items.B.2",
"items.B.3",
"items.B.4")
colnames(data)=cn
#assuming that "." represents structure
mapping=strsplit(cn,"\.")
#template JSON
jsonstructure <- fromJSON('{"default": {"A": "","B": "","C": ""},
"items": [{"A": "",
"B": {"1": "","2": "","3": "","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.
第一次发帖,长期潜伏。要温柔。中度 R 用户。我确信有更好、更实用的方法来做我需要的事情,但我觉得我已经研究过没有洞察力的死亡。
我正在尝试将数据集合并到 pre-existing JSON 结构中。对于许多序列化的 JSON 请求,每个 JSON 结构的一行记录。
我将数据集加载到包含 13 个变量的数据中,并更改列 headers 以匹配它们在 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",
"default.C": "",
"items.A": "0987654321",
"items.B.1": "4321",
"items.B.2": "4321",
"items.B.3": "4321",
"items.B.4": "4321",
}
]
]
如果你对 jsonlite 包没有死心塌地,你可以试试 rjson 包
library(rjson)
value = c("", "1234690","")
names(value) = c("A","B","C")
value2 = c("","0987654321","","0987654321")
names(value2) = c("1","2","3","4")
test <- toJSON(list( "default" = value, "items" = list(c("A" = "", "B" = list(value2))) ))
cat(test)
writeLines(test, "test.json")
无法重现您的结果 - 但这是我对您想要实现的目标的猜测。请参阅评论以获取有关代码的帮助。
library(jsonlite)
#data.frame with data - you have probably more than 2 rows
data=data.frame(rbind(t(c(NA,1234567890,NA,1234567890,1234,1234,1234,1234)),
t(c(1,NA,2,3,1,1000,NA,1234))))
cn=c("default.A",
"default.B",
"default.C",
"items.A",
"items.B.1",
"items.B.2",
"items.B.3",
"items.B.4")
colnames(data)=cn
#assuming that "." represents structure
mapping=strsplit(cn,"\.")
#template JSON
jsonstructure <- fromJSON('{"default": {"A": "","B": "","C": ""},
"items": [{"A": "",
"B": {"1": "","2": "","3": "","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.