2016-12-06 1 views
4

初めてのポスター、長い時間のlurker。穏やかな。中程度の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)] <- "" 

でNASに記入

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

にあなたが jsonliteパッケージに死んで設定されていない場合、あなたは試みることができる

[ 
    [ 
    { 
    "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のベクトルであれば、連想リストの[ので、 [i]]はリスト内の最後の索引付け結果以外のすべてを提供するalist [[i1]] ... [[ip]]と同等です。

+0

ところで私は「NA」処理をしませんでしたが、あなた自身がそれを理解できると思います。 ;) – cryo111

+0

私はこれを実験していましたが、いくつかの問題を抱えていました。 ループを実行すると、次のように表示されます。 '1のエラー:長さ0のnrow(データ):引数 ' あなたのコードをあなたの投稿から直接コピーして実行できます。 最後に、最終的な出力を見て、何らかの理由でJSON構造に詰め込まれているデータが、残りの値ではなくNA値を引用符で囲むことがあることがわかりました。 – p0wd3rd

+0

ad error)あなたは 'data'を指定していませんが、これは' data.frame'であると仮定しています。ここで、各行は 'JSON'オブジェクトに変換されなければなりません。この場合、報告しているこのエラーは表示されません。あなたの実際の入力がどのようにフォーマットされているのかわかりませんが、あなたは 'jsonstructure [[mapping]]] cryo111

0

と一致しない電流出力を変換します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") 
関連する問題