2016-12-16 64 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

謝謝。這看起來比我的第一種方法更好。我會給這個更多的時間:) –

相關問題