Notes et transcriptions du cours “Démarrer avec Go” proposée par University of California, Irvine disponible sur la plateforme coursera.
Le format JSON possède plusieurs propriétés avantageuses, notamment le fait qu'il est entièrement Unicode.
Ainsi, une fois que vous aurez converti quelque chose en JSON, tout objet JSON sera représenté sous forme de caractères Unicode, ce qui est une bonne chose car Unicode est lisible par l'homme.
Un mainteneur humain peut regarder le format JSON et comprendre, dans l'ensemble, de quoi il s'agit. Même si les données deviennent complexes, c'est lisible par un humain.
C'est aussi une représentation assez compacte. Je dis “assez” compacte, parce que ce n'est pas totalement compact. En ayant pour objectif de le rendre compact exclusivement, il ne serait plus lisible par un humain. Si vous preniez l'objet JSON et que vous le compressiez, vous obtiendrez quelque chose de plus petit, mais vous ne pourriez plus le lire, l'appréhender directement : il est donc relativement compact et lisible par l'homme, il est aussi petit que possible tout en restant lisible.
Les types contenus dans JSON peuvent être combinés de manière récursive. Retenons que l'objectif est de représenter les différentes structures de données que nous avons en Golang sous forme d'objets JSON.
Ils peuvent donc être combinés de manière récursive. Vous pouvez avoir un tableau d'entiers ou un tableau de structures ou une structure avec des structures à l'intérieur ou une structure avec des tableaux à l'intérieur et des entiers ou des chaînes de caractères. Vous pouvez donc tous les combiner de manière hiérarchique en GO. Une structure avec des structures à l'intérieur desquelles se trouvent d'autres structures, etc.
Vous pouvez définir des objets en Golang arbitrairement complexes et les convertir naturellement en JSON : c'est un gros avantage.
Le marshalling JSON, désigne la conversion, la sérialisation ou la génération d'une représentation JSON à partir d'un objet Go. Nous avons donc un objet arbitrairement complexe dans Go et nous voulons le traduire en un objet exprimé dans le format JSON : C'est ce qu'on appelle le marshalling, le marshalling JSON.
Pour l'exemple reprenons notre structure Person
dont voici la structure générale :
type struct Person { name string addr string phone string }
La structure contient les champs name
, addr
et phone
qui sont des chaînes de caractères.
Nous instancions un objet p1
du type Person
. Cette instance p1
, a un nom particulier, “Joe”, une adresse et un numéro de téléphone qui lui sont propre. Nous souhaitons à présent transformer cet objet Go en un objet JSON.
Pour cela nous appelons la fonction json.Marshal()
.
p1 := Person(name: "Joe", addr: "Rue des Lilas", phone: "+337 52 36 98 74") barr, err := json.Marshal(p1)
Notons qu'on passe en argument la structure golang que nous voulons convertir (p1
) et qu'elle renvoie deux choses : un tableau d'octets (barr
), et un code erreur (err
). L'erreur vaut nil
s'il n'y a pas de problème. Si la conversion s'effectue correctement, il devrait y avoir une valeur nil
. S'il n' y a aucune erreur, la fonction renvoie le tableau d'octets contenant la représentation JSON. N'oubliez pas que le JSON est entièrement en Unicode, donc ce tableau d'octets est ensemble de runes, en gros, un tableau de celles-ci : c'est la représentation JSON. Donc, ce que fait json.marshal()
, c'est qu'elle prend un objet Golang et vous renvoie une représentation JSON.
L' unmarshalling JSON (désérialisation) c'est donc l'inverse. A partir d'un tableau d'octets contenant un objet JSON on effectue une conversion en un objet Golang stockant les mêmes informations.
Toujours à partir de notre structure Person
et de l'exemple précédent, nous avons déjà créé notre variable barr
, qui désigne le tableau d'octets au format JSON, la représentation JSON d'une personne.
var p2 Person err := json.Unmarshal(barr, &p2)
Nous voulons donc prendre cette représentation JSON et créer une structure Golang contenant les mêmes informations. Pour cela, nous déclarons cette structure golang en ligne 1, p2
est de type Person
mais nous n'avons pas encore renseigné les valeurs des champs name
, addr
et phone
. Nous avons donc juste une personne et elle est pratiquement vide, puis nous appelons json.unmarshall()
.
Notez qu'il existe deux arguments à transmettre à json.unmarshall()
. Le premier argument est le tableau d'octets qui contient l'objet JSON. Le deuxième argument est l'adresse de la structure Go, dans laquelle nous voulons placer les résultats de la désérialisation c'est à dire l' adresse de p2
. Le tableau barr
contient des informations d'une personne, nous voulons qu'elles soient placées dans p2
que nous avons créé, qui est, pour le moment, vide.
Ainsi, lors de l'appel de la fonction json.unbmarshal()
, les informations contenues dans le tableau viennent peupler les valeurs des champs appropriés de p2
, la structure de type Person
.
L'une des contraintes est que ce second paramètre de json.unmarshal()
, ici p2
doit correspondre aux données JSON contenues dans le tableau d'octets. Les attributs de l'objet JSON doivent correspondre aux champs de la structure Golang. En cas d'anomalie lors de la désérialisation/conversion, un code erreur non null est retourné dans err
.