2

私が使用している API では、次のJSONようなメッセージを送信する必要があります。

y <- '[{"a":1, "b":"select", "c":["A", "B", "C"]}, 
       {"a":2, "b":"text"},
       {"a":3, "b":"select", "c":["D", "E", "F", "G"]}]'

この場合、値が配列である"b" : "select"別の変数があることに注意してください。c

fromJSON(y)jsonliteパッケージ内で)実行しようとするとdata.frame、3列目がリストである場所が表示されます:

> z <- fromJSON(y) 
> class(z)
[1] "data.frame"
> z %>% glimpse()
Observations: 3
Variables: 3
$ a (int) 1, 2, 3
$ b (chr) "select", "text", "select"
$ c (list) A, B, C, NULL, D, E, F, G

JSON しかし、それを(API に送信したい形式である)に戻すと、c変数が本来あるべきでない場所に表示されます。

[{"a":1,"b":"select","c":["A","B","C"]},
 {"a":2,"b":"text","c":{}},
 {"a":3,"b":"select","c":["D","E","F","G"]}]

(または他の何かを使用して)データフレームから元のJSONメッセージに確実に到達できる別のRデータ構造はありますか?jsonliteそれはどのように機能しますか?

4

2 に答える 2

5

を使用するとjsonlite、次のように実行できます。

z <- fromJSON(y, simplifyDataFrame = F)
toJSON(z, auto_unbox=T)

さらに、最後のc要素がである次のケースを検討して["D"]ください。

y2 <- '[{"a":1, "b":"select", "c":["A", "B", "C"]}, 
        {"a":2, "b":"text"}, 
        {"a":3, "b":"select", "c":["D"]}]'

z2 <- fromJSON(y2, simplifyDataFrame = F)
toJSON(z2, auto_unbox=T)

結果は次のとおりです。

[{"a":1,"b":"select","c":["A","B","C"]},
 {"a":2,"b":"text"},
 {"a":3,"b":"select","c":"D"}]

最後のc要素が では"D"ないため、これは問題になる可能性があり["D"]ます。

これを防ぐには、 を使用しないでauto_unboxください。unbox次のように慎重に使用してください。

z2 <- fromJSON(y2, simplifyDataFrame = F)
for(i in 1:length(z2)){
  z2[[i]][[1]] <- unbox(z2[[i]][[1]])
  z2[[i]][[2]] <- unbox(z2[[i]][[2]])
}
toJSON(z2)
于 2016-01-14T15:20:15.083 に答える