2016-12-06 18 views
4

第一次海報,很久以前的潛伏者。要溫柔。中等R用戶。我相信有一種更好的,功能性的方式來做我所需要的,但感覺就像我研究過沒有洞察力的死亡。如何將數據合併到R中預先存在的JSON結構中?

我想合併一個數據集到一個預先存在的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。合併它們。填補空白

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

的NA轉換成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", 
    } 
    ] 
] 

回答

1

無法重現您的結果 - 但這裏是我對您要達到的目標的猜測。請參閱註釋以獲取有關代碼的幫助。

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 
#  } 
# } 
# ] 
#} 

又一個註釋。我的方法利用列表的遞歸子集的如幫助描述了[操作者:

[[可以遞歸地應用於列表,這樣,如果所述單個索引i是長度爲p的向量,ALIST [ [i]]等同於alist [[i1]] ... [[ip]],除了最終的索引結果外,其餘都列在列表中。

+0

順便說一句:我沒有做NA處理,但我想你可以自己弄清楚。 ;) – cryo111

+0

我一直在嘗試這個,但碰到一些問題。 在運行您的循環時,我收到: '1:nrow(data):參數長度爲0的錯誤' 我可以直接從您的帖子中複製代碼。 最後,查看最終輸出(並從我的結尾也可以重現),我發現由於某種原因,被填充到JSON結構中的數據有時會引用NA值而不是剩餘值。 – p0wd3rd

+0

廣告錯誤)您尚未指定'data',但我假定這是一個'data.frame',其中每行必須轉換爲'JSON'對象。如果是這種情況,那麼您報告的錯誤不應顯示出來。 )我不知道你的實際輸入是如何格式化的,但是你可能會更接近你想用'jsonstructure [[mapping [[i]]]] - cryo111

0

如果你不死心塌地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") 
相關問題