Le format JSON est un format de plus en plus utilisé pour stocker des données, notamment pour les données issues du web. Cependant, sa structure particulière peut poser des problèmes pour obtenir un dataframe dans R.
Fonctions utilisées dans la fiche
Packages
Fonctions
jsonlite
fromJSON
rjson
fromJSON
data.table
rbindlist
Base R
as.data.frame - knitr - class
Introduction
Pour importer des données au format JSON, nous proposons deux packages rjson et jsonlite. Le dernier est beaucoup plus facile d’utilisation et renvoie automatiquement une base de donnée faites de colonnes. Je propose rjson comme une alternative à jsonlite en cas de pépin.
Données d’exemples
Le format JSON est surtout utilisé pour les données issues d’API web ou de source OpenData. Pour les exemples ci-dessous nous utiliserons donc des données issues du site de la SNCF qui mettent à disposition un grand nombre de jeux de données en libre accès, et notamment dans notre cas, une base de données des menus des wagons-bars de TGV1.
Capsule de 6,5 g de café moulu illy, mélange 100% Arabica
NA
NA
4
NON
NON
NON
NON
NA
NA
NA
NA
2023-06-22
2023-10-12
Cappuccino grand, Illy
4.9
Boissons gourmandes
Boissons
NON
NON
2 Capsules de 15g de lait (lait entier, sirop de glucose, sucre), capsule de 14,5 g de café 100% Arabica, chocolat (chocolat en poudre 59.4% (sucre, cacao 32% minimum), lait écrémé en poudre 38.5%, lactose, antiagglomérant (E551), sel, arôme)
On obtient un objet de type list2, que l’on peut transformer en base de donnée avec l’exemple suivant.
Une liste peut-être un objet assez complexe mais en fouillant dedans, il est possible de retrouver (ou de mettre en forme) une base de donnée. Dans notre cas plutôt simple, on remarque que la liste a autant d’élément que d’individus, et lorsqu’on regarde à l’intérieur de chaque élément, on trouve la réponse pour chaque individu à chacune des variables.
On va donc extraire ces informations et les compiler dans une base de donnée ordonnées.
Capsule de 6,5 g de café moulu illy, mélange 100% Arabica
NULL
NULL
4
NON
NON
NON
NON
NULL
NULL
NULL
NULL
2023-06-22
2023-10-12
Cappuccino grand, Illy
4.9
Boissons gourmandes
Boissons
NON
NON
2 Capsules de 15g de lait (lait entier, sirop de glucose, sucre), capsule de 14,5 g de café 100% Arabica, chocolat (chocolat en poudre 59.4% (sucre, cacao 32% minimum), lait écrémé en poudre 38.5%, lactose, antiagglomérant (E551), sel, arôme)
Capsule de 6,5 g de café moulu illy, mélange 100% Arabica
NA
NA
4
NON
NON
NON
NON
NA
NA
NA
NA
2023-06-22
2023-10-12
Cappuccino grand, Illy
4.9
Boissons gourmandes
Boissons
NON
NON
2 Capsules de 15g de lait (lait entier, sirop de glucose, sucre), capsule de 14,5 g de café 100% Arabica, chocolat (chocolat en poudre 59.4% (sucre, cacao 32% minimum), lait écrémé en poudre 38.5%, lactose, antiagglomérant (E551), sel, arôme)
---title: "Format JSON : de la liste au dataframe"# subtitle: ""categories: - Json - Importationauthor: - name: "Arno Muller" affiliations: - name: "Ined"date: 06/28/2023image: "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c9/JSON_vector_logo.svg/langfr-1024px-JSON_vector_logo.svg.png"format: html: defaultcode-annotations: belowabstract: | Le format JSON est un format de plus en plus utilisé pour stocker des données, notamment pour les données issues du web. Cependant, sa structure particulière peut poser des problèmes pour obtenir un dataframe dans R.---| Packages | Fonctions ||---------------|-------------------------------------------------|| **jsonlite** | `fromJSON` || **rjson** | `fromJSON` || **data.table**| `rbindlist` || **Base R** | `as.data.frame` - `knitr` - `class` |: **Fonctions utilisées dans la fiche**# IntroductionPour importer des données au format JSON, nous proposons deux packages `rjson` et `jsonlite`.Le dernier est beaucoup plus facile d'utilisation et renvoie automatiquement une base de donnée faites de colonnes.Je propose `rjson` comme une alternative à `jsonlite` en cas de pépin.# Données d'exemplesLe format JSON est surtout utilisé pour les données issues d'API web ou de source OpenData.Pour les exemples ci-dessous nous utiliserons donc des données issues du site de la SNCF qui mettent à disposition un grand nombre de jeux de données en libre accès, et notamment dans notre cas, une **base de données des menus des wagons-bars de TGV**[^1].[^1]: <https://ressources.data.sncf.com/explore/dataset/menus-des-bars-tgv/table/># Importer des données avec `jsonlite`::: {.content-visible when-format="html"}```{r message=FALSE, warning=FALSE}library(jsonlite)menu_TGV <- jsonlite::fromJSON("DATA/menus-des-bars-tgv.json")# Pour voir les 3 premières ligneslibrary(knitr)kable(head(menu_TGV,3))```::: ::: {.content-visible when-format="docx"}```{r message=FALSE, warning=FALSE}head(menu_TGV,3)```:::# Importer des données avec `rjson````{r}library(rjson)menu_TGV <- rjson::fromJSON(file ="DATA/menus-des-bars-tgv.json")class(menu_TGV)```On obtient un objet de type `list`[^2], que l'on peut transformer en base de donnée avec l'exemple suivant. [^2]: Pour découvrir comment utiliser des listes : <https://juba.github.io/tidyverse/16-structures-donnees.html#sec-listes>Une liste peut-être un objet assez complexe mais en fouillant dedans, il est possible de retrouver (ou de mettre en forme) une base de donnée.Dans notre cas plutôt simple, on remarque que la liste a autant d'élément que d'individus, et lorsqu'on regarde à l'intérieur de chaque élément, on trouve la réponse pour chaque individu à chacune des variables.![](img/liste_explic.png){width="75%"}On va donc extraire ces informations et les compiler dans une base de donnée ordonnées.::: {.content-visible when-format="html"}```{r warning=FALSE}# Convertir la liste en data frame par lignesmenu_df <- as.data.frame(do.call(rbind, menu_TGV))kable(head(menu_df,3))# Même chose avec le package data.tablelibrary(data.table)menu_df2 <- rbindlist(menu_TGV)kable(head(menu_df2,3))```:::::: {.content-visible when-format="docx"}```{r warning=FALSE}# Convertir la liste en data frame par lignesmenu_df <- as.data.frame(do.call(rbind, menu_TGV))head(menu_df,3)``````{r warning=FALSE}# Même chose avec le package data.tablelibrary(data.table)menu_df2 <- rbindlist(menu_TGV)head(menu_df2,3)```:::