Format JSON : de la liste au dataframe

Json
Importation
Auteur·rice
Affiliation

Arno Muller

Ined

Date de publication

28 juin 2023

Résumé

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.

Importer des données avec jsonlite

library(jsonlite)
menu_TGV <- jsonlite::fromJSON("DATA/menus-des-bars-tgv.json")

# Pour voir les 3 premières lignes
library(knitr)
kable(head(menu_TGV,3))
date_debut date_fin produit prix_au_produit type categorie_produit presence_de_porc presence_d_alcool composants allergenes allergenes_susceptibles_de_provenir_de_contaminations_croisees kcal_pour_100_ml_ou_100g recette_vegetarienne recette_vegane bio sans_gluten poids_g_cl proteines_100g_100ml glucides_100g_100ml lipides_100g_100ml
2023-06-22 2023-10-12 Café lungo, Illy 2.9 Thé, café & chocolat Boissons NON NON 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) Lactose Arachides, amandes, noix, soja, oeufs, poissons, crustaces, sésame, céréales, sulfites, lupin, céleri, moutarde NA NON NON NON NON NA NA NA NA
2023-06-22 2023-10-12 Latte Macchiato grand, Illy 4.9 Boissons gourmandes Boissons NON NON Capsule de 6,5 g de café moulu illy, mélange 100% Arabica, 2 Capsules de 15g de lait (lait entier, sirop de glucose, sucre) Lactose Arachides, amandes, noix, soja, oeufs, poissons, crustaces, sésame, céréales, sulfites, lupin, céleri, moutarde NA NON NON NON NON NA NA NA NA

Importer des données avec rjson


Attachement du package : 'rjson'
Les objets suivants sont masqués depuis 'package:jsonlite':

    fromJSON, toJSON
menu_TGV <- rjson::fromJSON(file = "DATA/menus-des-bars-tgv.json")
class(menu_TGV)
[1] "list"

On obtient un objet de type list 2, 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.

# Convertir la liste en data frame par lignes
menu_df <- as.data.frame(do.call(rbind, menu_TGV))
kable(head(menu_df,3))
date_debut date_fin produit prix_au_produit type categorie_produit presence_de_porc presence_d_alcool composants allergenes allergenes_susceptibles_de_provenir_de_contaminations_croisees kcal_pour_100_ml_ou_100g recette_vegetarienne recette_vegane bio sans_gluten poids_g_cl proteines_100g_100ml glucides_100g_100ml lipides_100g_100ml
2023-06-22 2023-10-12 Café lungo, Illy 2.9 Thé, café & chocolat Boissons NON NON 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) Lactose Arachides, amandes, noix, soja, oeufs, poissons, crustaces, sésame, céréales, sulfites, lupin, céleri, moutarde NULL NON NON NON NON NULL NULL NULL NULL
2023-06-22 2023-10-12 Latte Macchiato grand, Illy 4.9 Boissons gourmandes Boissons NON NON Capsule de 6,5 g de café moulu illy, mélange 100% Arabica, 2 Capsules de 15g de lait (lait entier, sirop de glucose, sucre) Lactose Arachides, amandes, noix, soja, oeufs, poissons, crustaces, sésame, céréales, sulfites, lupin, céleri, moutarde NULL NON NON NON NON NULL NULL NULL NULL
# Même chose avec le package data.table
library(data.table)
menu_df2 <- rbindlist(menu_TGV)
kable(head(menu_df2,3))
date_debut date_fin produit prix_au_produit type categorie_produit presence_de_porc presence_d_alcool composants allergenes allergenes_susceptibles_de_provenir_de_contaminations_croisees kcal_pour_100_ml_ou_100g recette_vegetarienne recette_vegane bio sans_gluten poids_g_cl proteines_100g_100ml glucides_100g_100ml lipides_100g_100ml
2023-06-22 2023-10-12 Café lungo, Illy 2.9 Thé, café & chocolat Boissons NON NON 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) Lactose Arachides, amandes, noix, soja, oeufs, poissons, crustaces, sésame, céréales, sulfites, lupin, céleri, moutarde NA NON NON NON NON NA NA NA NA
2023-06-22 2023-10-12 Latte Macchiato grand, Illy 4.9 Boissons gourmandes Boissons NON NON Capsule de 6,5 g de café moulu illy, mélange 100% Arabica, 2 Capsules de 15g de lait (lait entier, sirop de glucose, sucre) Lactose Arachides, amandes, noix, soja, oeufs, poissons, crustaces, sésame, céréales, sulfites, lupin, céleri, moutarde NA NON NON NON NON NA NA NA NA