2016-12-16 44 views
1

假设你有以下数据:转换两个数据结构的组合到一个特定的JSON对象

obj1 <- list('A', 'B', c('A', 'B')) 
obj2 <- rep(1, 3) 

产生的JSON对象我所需要的,这是两者的结合,看起来像这样:

[{'obj1':['A'], 'obj2':[1]},{'obj1':['B'], 'obj2':[1]}, {'obj1':['A','B'], 'obj2':[1]}] 

请注意,即使像A这样的单个元素也包含在方括号内!

我现在的问题是,什么是最简单的方法来产生这个JSON结构? obj1obj2不一定是列表或向量。它也可以是一个单一的数据框。重要的是最终的JSON输出的结构。

我尝试迄今

tmp <- lapply(obj1, FUN = function(x) { 
    x <- list("obj1" = x) 
    x$obj2 <- obj2[1] 
    obj2 <<- obj2[-1] 
    return(x) 
}) 
jsonlite::toJSON(tmp) 

它确实工作。它似乎并不是最好的尝试。

+0

的值在'obj2'是全1,但以实施例输出10个,10个,0.5。那是故意的吗? (我猜不是)。 – nrussell

+0

不,它不是。我的错。抱歉。编辑完成。 –

回答

2

这似乎工作:

df <- data.frame(obj1 = I(obj1), obj2 = I(as.list(obj2))) 
toJSON(df) 
# [{"obj1":["A"],"obj2":[1]},{"obj1":["B"],"obj2":[1]},{"obj1":["A","B"],"obj2":[1]}] 

jsonlite::toJSON(tmp) 
# [{"obj1":["A"],"obj2":[1]},{"obj1":["B"],"obj2":[1]},{"obj1":["A","B"],"obj2":[1]}] 

这里的关键点是

  • 使用I()确保列类型list
  • df的列需要进行命名(obj1obj2
  • obj2也需要被强制为listas.list(obj2))以便得到例如的"obj2":[1]代替"obj2":1

我通过逆向工程所需输出确定此:

json <- gsub(
    "'", '"', 
    "[{'obj1':['A'],'obj2':[1]},{'obj1':['B'],'obj2':[1]},{'obj1':['A','B'],'obj2':[1]}]" 
) 
str(fromJSON(json)) 
# 'data.frame': 3 obs. of 2 variables: 
# $ obj1:List of 3 
# ..$ : chr "A" 
# ..$ : chr "B" 
# ..$ : chr "A" "B" 
# $ obj2:List of 3 
# ..$ : int 1 
# ..$ : int 1 
# ..$ : int 1 
+0

谢谢。这看起来比我的第一种方法更好。我会给这个更多的时间:) –

相关问题