J'ai une trame de données que j'aime convertir au format json:
ma trame de données appelée res1:
library(rjson)
structure(list(id = c(1, 2, 3, 4, 5), value = structure(1:5, .Label = c("server1",
"server2", "server3", "server4", "server5"), class = "factor")), .Names = c("id",
"value"), row.names = c(NA, -5L), class = "data.frame")
quand je fais:
toJSON(res1)
J'ai compris:
{"id":[1,2,3,4,5],"value":["server1","server2","server3","server4","server5"]}
J'ai besoin que cette sortie json soit comme ça, des idées?
[{"id":1,"value":"server1"},{"id":2,"value":"server2"},{"id":3,"value":"server3"},{"id":4,"value":"server4"},{"id":5,"value":"server5"}]
Que diriez-vous
library(rjson)
x <- toJSON(unname(split(res1, 1:nrow(res1))))
cat(x)
# [{"id":1,"value":"server1"},{"id":2,"value":"server2"},
# {"id":3,"value":"server3"},{"id":4,"value":"server4"},
# {"id":5,"value":"server5"}]
En utilisant split()
, nous divisons essentiellement le grand data.frame en un data.frame distinct pour chaque ligne. Et en supprimant les noms de la liste résultante, la fonction toJSON
encapsule les résultats dans un tableau plutôt que dans un objet nommé.
Le package jsonlite existe pour résoudre exactement ce problème: "Un mappage pratique et cohérent entre les données JSON et les objets R."
Sa fonction toJSON
fournit ce résultat souhaité avec les options par défaut:
library(jsonlite)
x <- toJSON(res1)
cat(x)
## [{"id":1,"value":"server1"},{"id":2,"value":"server2"},
## {"id":3,"value":"server3"},{"id":4,"value":"server4"},
## {"id":5,"value":"server5"}]
Vous pouvez maintenant simplement appeler jsonlite::write_json()
directement sur la trame de données.
Vous pouvez également utiliser library(jsonify)
jsonify::to_json( res1 )
# [{"id":1.0,"value":"server1"},{"id":2.0,"value":"server2"},{"id":3.0,"value":"server3"},{"id":4.0,"value":"server4"},{"id":5.0,"value":"server5"}]