Voici les données brutes json :
json_file <- '[{"name":"Doe, John","group":"Red","age":{"v_0":24}},
{"name":"Doe, Jane","group":"Green","age":{"v_0":31}},
{"name":"Smith, Joan","group":"Yellow","age":{"v_0":22}}]'
Lorsque je veux convertir json_file en un bloc de données:
Error: parse error: trailing garbage
:"Red","age":{"v_0":24}} {"name":"Doe, Jane","group":"Gr
(right here) ------^
J'obtiens cette erreur:
library(RJSONIO) json_file <- fromJSON(json_file)
Je sais que si je change les données brutes pour les données suivantes, tout ira bien:
json_file <- '{"name":"Doe, John","group":"Red","age":{"v_0":24}}
{"name":"Doe, Jane","group":"Green","age":{"v_0":31}}
{"name":"Smith, Joan","group":"Yellow","age":{"v_0":22}}'
Mais en fait, j'aimerais savoir:
1) Comment obtenir une trame de données à partir des données brutes sans diviser ses objets en utilisant [, , et ?
2) S'il n'y a aucun moyen, comment diviser des objets dans un gros json code> en ajoutant , à la fin de chaque ligne à l'exception de la dernière ligne, et en ajoutant également [ et ] à la première et à la dernière ligne de le fichier?
3 Réponses :
Vos données json brutes sont déjà divisées en objets individuels. De plus, dans l'ensemble, les données json ne sont pas valides. Heureusement, comme vous l'avez remarqué, si vous insérez , à la fin de chaque ligne (sauf la dernière) et mettez le tout entre crochets, vous obtenez une collection de paires de clés (ou tableaux). Vous devriez donc plutôt demander: "Comment combiner tous les éléments en un seul data.frame?"
La solution: dplyr::bind_rows(fromJSON(json_file))
json_file <- paste0('[', json_file, ']')
Suivi:
En supposant que les objets json ne contiennent pas de retours à la ligne , vous pouvez effectuer une recherche-remplacement facile:
json_file <- gsub('\n', ',', trimws(json_file), fixed=TRUE)
J'ai mis les trimws pour supprimer les éventuelles nouvelles lignes de fin.
Ensuite, vous l'entourez de crochets:
# A tibble: 3 x 3 name group age <chr> <chr> <dbl> 1 Doe, John Red 24 2 Doe, Jane Green 31 3 Smith, Joan Yellow 22
et vous êtes de retour sur la bonne voie.
Donc, je dois insérer , à la fin de chaque ligne, attendre la dernière et mettre manuellement les données brutes entre crochets? Maintenant, que faire si j'ai un gros fichier json ?
Définissez «grand».
Lorsque nous avons beaucoup d'objets comme 10000 objets.
Cela ne devrait pas être un problème dans R.
Vous avez besoin de ces crochets. Enregistrez ce qui suit sous 'test.json':
print(result) $ID [1] "1" "2" "3" "4" "5" "6" "7" "8" $Name [1] "Rick" "Dan" "Michelle" "Ryan" "Gary" "Nina" "Simon" "Guru" $Salary [1] "623.3" "515.2" "611" "729" "843.25" "578" "632.8" "722.5" $StartDate [1] "1/1/2012" "9/23/2013" "11/15/2014" "5/11/2014" "3/27/2015" "5/21/2013" "7/30/2013" "6/17/2014" $Dept [1] "IT" "Operations" "IT" "HR" "Finance" "IT" "Operations" "Finance"
Maintenant, chargez la bibliothèque requise et pointez sur ce fichier que vous venez d'enregistrer:
# Load the package required to read JSON files.
library("rjson")
# Give the input file name to the function.
result <- fromJSON(file = "C:\\Users\\Excel\\Documents\\test.json")
# Print the result.
print(result)
Résultat:
{
"ID":["1","2","3","4","5","6","7","8" ],
"Name":["Rick","Dan","Michelle","Ryan","Gary","Nina","Simon","Guru" ],
"Salary":["623.3","515.2","611","729","843.25","578","632.8","722.5" ],
"StartDate":[ "1/1/2012","9/23/2013","11/15/2014","5/11/2014","3/27/2015","5/21/2013",
"7/30/2013","6/17/2014"],
"Dept":[ "IT","Operations","IT","HR","Finance","IT","Operations","Finance"]
}
Il existe des moyens de le faire sans avoir à modifier le fichier.
Si vous voulez un data.frame:
json_data_as_list <- readLines("path/to/file.json") %>% lapply(fromJSON)
ou si vous voulez une liste:
library(jsonlite)
# url
zips <- stream_in(url("http://media.mongodb.org/zips.json"))
# file
json_data <- stream_in(file("path/to/file.json"))
Utilisez
stream_in (). Voir: github.com/jeroen/jsonlite/issues/59Double possible: stackoverflow.com/questions/16705259/...
Autre doublon possible: stackoverflow.com / questions / 31574842 /…