forked from quentin/quentin.dufour.io
JSON
This commit is contained in:
parent
c98e74378e
commit
f05238ac4e
1 changed files with 181 additions and 0 deletions
181
_posts/2017-01-22-json.md
Normal file
181
_posts/2017-01-22-json.md
Normal file
|
@ -0,0 +1,181 @@
|
||||||
|
---
|
||||||
|
layout: post
|
||||||
|
slug: json
|
||||||
|
status: published
|
||||||
|
title: JSON simplement
|
||||||
|
description: Simplifiez-vous la vie
|
||||||
|
disqus: true
|
||||||
|
categories:
|
||||||
|
- code
|
||||||
|
tags:
|
||||||
|
---
|
||||||
|
|
||||||
|
Cet article a pour but d'expliquer ce qu'est JSON et de montrer des cas simples d'utilisation avec python.
|
||||||
|
Encore une fois, il n'est pas exhaustif et ne s'adresse pas à des experts.
|
||||||
|
Les exemples seront données avec python, mais JSON peut-être utilisé avec n'importe quel langage de programmation.
|
||||||
|
|
||||||
|
JSON est une abbréviation qui signifie *JavaScript Object Notation*.
|
||||||
|
A vrai dire, ce n'est pas très important et ça ne nous informe pas particulièrement sur son usage.
|
||||||
|
|
||||||
|
Prenons un exemple pour bien comprendre :
|
||||||
|
|
||||||
|
## Le contexte : ma bibliothèque
|
||||||
|
|
||||||
|
Imaginons que vous commenciez à faire l'inventaire des livres de votre bibliothèque en python :
|
||||||
|
|
||||||
|
```python3
|
||||||
|
# On créer un nouveau tableau qui contiendra nos livres
|
||||||
|
bibliotheque = []
|
||||||
|
while True:
|
||||||
|
print(bibliotheque)
|
||||||
|
livre = input()
|
||||||
|
bibliotheque.append(livre)
|
||||||
|
```
|
||||||
|
|
||||||
|
Si on a le malheur d'arrêter l'application, alors on perd tout le contenu du tableau bibliothèque.
|
||||||
|
Et donc à chaque démarrage, on doit de nouveau rerentrer les livres.
|
||||||
|
Pas très pratique, mais il doit bien y avoir une solution !
|
||||||
|
|
||||||
|
## Ecrivons la liste des livres dans un fichier
|
||||||
|
|
||||||
|
La solution est donc d'écrire la liste des livres dans un fichier.
|
||||||
|
Oui, mais c'est pas si simple. Comment je vais faire ?
|
||||||
|
Je vais séparer mes livres par des virgules ? Si mon titre contient une virgule, que va t'il se passer ?
|
||||||
|
Un livre sur chaque ligne alors ? Et si on veut rajouter d'autres informations après ?
|
||||||
|
|
||||||
|
Mais ça veut dire que l'on va devoir écrire une fonction qui va convertir notre tableau en une chaine de caractère que l'on va enregistrer dans notre fichier,
|
||||||
|
ainsi qu'une autre fonction qui va lire une chaine de caractère d'un fichier et la transformer en fichier.
|
||||||
|
|
||||||
|
Dans notre cas, c'est plutot simple mais ça peut vite se complexifier :
|
||||||
|
|
||||||
|
```python3
|
||||||
|
import os
|
||||||
|
|
||||||
|
def sauvegarder(bibliotheque):
|
||||||
|
# --- on convertit bibliotheque (un tableau) en chaine de caractère ---
|
||||||
|
contenu = ""
|
||||||
|
for livre in bibliotheque:
|
||||||
|
# on ajoute à contenu un livre et un retour à la ligne
|
||||||
|
contenu += livre + "\n"
|
||||||
|
|
||||||
|
# --- on sauvegarde la chaine de caractère ---
|
||||||
|
with open('sauvegarde.txt', 'w') as fichier:
|
||||||
|
fichier.write(contenu)
|
||||||
|
|
||||||
|
def charger():
|
||||||
|
# --- on lit le fichier ---
|
||||||
|
contenu = ""
|
||||||
|
with open('sauvegarde.txt') as fichier:
|
||||||
|
contenu = fichier.read()
|
||||||
|
|
||||||
|
# --- on convertit la chaine de caractère en bibliotheque (tableau) ---
|
||||||
|
bibliotheque = contenu.split("\n")
|
||||||
|
return bibliotheque
|
||||||
|
|
||||||
|
bibliotheque = []
|
||||||
|
|
||||||
|
# Si le fichier de sauvegarde existe, on le charge
|
||||||
|
if os.path.isfile('sauvegarde.txt'):
|
||||||
|
bibliotheque = charger()
|
||||||
|
|
||||||
|
while True:
|
||||||
|
print(bibliotheque)
|
||||||
|
livre = input()
|
||||||
|
bibliotheque.append(livre)
|
||||||
|
|
||||||
|
# on sauvegarde
|
||||||
|
sauvegarder(bibliotheque)
|
||||||
|
```
|
||||||
|
|
||||||
|
**Récapitulons :**
|
||||||
|
|
||||||
|
* On doit convertir notre variable (tableau, dictionnaire) en chaine de caractère
|
||||||
|
* On doit écrire ou lire un fichier
|
||||||
|
|
||||||
|
## Un modèle plus compliqué, impossible de convertir à la main le tableau en chaine de caractère
|
||||||
|
|
||||||
|
Imaginons qu'à la place d'un simple titre, on veuille stocker plus d'informations :
|
||||||
|
|
||||||
|
```python3
|
||||||
|
# On créer un nouveau tableau qui contiendra nos livres
|
||||||
|
bibliotheque = []
|
||||||
|
while True:
|
||||||
|
print(bibliotheque)
|
||||||
|
livre = {} # On créer un dictionnaire python
|
||||||
|
livre['titre'] = input("titre > ")
|
||||||
|
livre['auteur'] = input("auteur > ")
|
||||||
|
livre['edition'] = input("edition > ")
|
||||||
|
```
|
||||||
|
|
||||||
|
On devrait alors modifier les parties conversions des fonctions charger et sauvegarder.
|
||||||
|
Mais est-ce que l'ordinateur ne pourrait pas de lui-même convertir notre tableau en texte ?
|
||||||
|
Oui, on appelle ça sérializer et déserializer des données (magnifique anglicisme au passage).
|
||||||
|
Et JSON est une manière de faire ça, de convertir un tableau, un dictionnaire python, etc. en texte et vice-versa.
|
||||||
|
|
||||||
|
## Découvrons JSON
|
||||||
|
|
||||||
|
Donc JSON permets de convertir certaines variables (tableau, dictionnaire) en texte.
|
||||||
|
Voici un exemple avec notre bibliotheque
|
||||||
|
|
||||||
|
```python3
|
||||||
|
>>> import json
|
||||||
|
>>> bibliotheque = []
|
||||||
|
>>> livre = {}
|
||||||
|
>>> livre['auteur'] = "J. K. Rowling"
|
||||||
|
>>> livre['titre'] = "Harry Potter 1"
|
||||||
|
>>> livre['edition'] = "Galimard"
|
||||||
|
>>> bibliotheque.append(livre)
|
||||||
|
>>> livre2['auteur'] = "Terry Pratchett"
|
||||||
|
>>> livre2 = {}
|
||||||
|
>>> livre2['auteur'] = "Terry Pratchett"
|
||||||
|
>>> livre2['titre'] = "Les annales du disque monde"
|
||||||
|
>>> livre2['edition'] = "Hachette"
|
||||||
|
>>> bibliotheque.append(livre2)
|
||||||
|
>>> json.dumps(bibliotheque)
|
||||||
|
'[{"edition": "Galimard", "titre": "Harry Potter 1", "auteur": "J. K. Rowling"}, {"edition": "Hachette", "titre": "Les annales du disque monde", "auteur": "Terry Pratchett"}]'
|
||||||
|
```
|
||||||
|
|
||||||
|
Tout en bas, la chaine de caractère, c'est la représentation JSON du contenu de votre variable bibliotheque. Copiez-collez le et ouvrez une nouvelle fenêtre python pour taper :
|
||||||
|
|
||||||
|
```python3
|
||||||
|
>>> import json
|
||||||
|
>>> bibliotheque = json.loads('[{"edition": "Galimard", "titre": "Harry Potter 1", "auteur": "J. K. Rowling"}, {"edition": "Hachette", "titre": "Les annales du disque monde", "auteur": "Terry Pratchett"}]')
|
||||||
|
>>> bibliotheque[0]['titre']
|
||||||
|
'Harry Potter 1'
|
||||||
|
```
|
||||||
|
|
||||||
|
Voilà, votre tableau bibliothèque a été chargé avec le même contenu que tout à l'heure, sans que vous n'ayez vous même à convertir quoi que ce soit !
|
||||||
|
|
||||||
|
## Utiliser json avec des fichiers
|
||||||
|
|
||||||
|
Si on voulait réécrire les fonction sauvegarde() et charger() précédentes, on pourrait utiliser les fonctions déjà existantes de json pour écrire dans un fichier. **Notez la présence d'un S à la fin dans `json.loads()` et `json.dumps() au dessus qui génèrent une chaine de caractère VS l'absence de ce S dans `json.load()` et `json.dump()` qui écrivent directement dans un fichier**
|
||||||
|
|
||||||
|
```python3
|
||||||
|
import json, os
|
||||||
|
|
||||||
|
def sauvegarder(bibliotheque):
|
||||||
|
with open('sauvegarde.txt', 'w') as fichier:
|
||||||
|
json.dump(bibliotheque, fichier)
|
||||||
|
|
||||||
|
def charger():
|
||||||
|
with open('sauvegarde.txt') as fichier:
|
||||||
|
return json.load(fichier)
|
||||||
|
|
||||||
|
# On créer un nouveau tableau qui contiendra nos livres
|
||||||
|
bibliotheque = []
|
||||||
|
|
||||||
|
if os.path.isfile('sauvegarde.txt'):
|
||||||
|
bibliotheque = charger()
|
||||||
|
|
||||||
|
while True:
|
||||||
|
print(bibliotheque)
|
||||||
|
livre = {} # On créer un dictionnaire python
|
||||||
|
livre['titre'] = input("titre > ")
|
||||||
|
livre['auteur'] = input("auteur > ")
|
||||||
|
livre['edition'] = input("edition > ")
|
||||||
|
sauvegarder()
|
||||||
|
```
|
||||||
|
|
||||||
|
JSON ne sert pas qu'à sauvegarder des fichiers. Il permets aussi de faire communiquer des programmes écrits dans des langages différents via le réseau par exemple.
|
||||||
|
|
||||||
|
Bon courage !
|
Loading…
Reference in a new issue