JSON : n'assumez rien sauf une chose

samedi 27 janvier 2024 par socraticDev

JSON est un acronyme signifiant "JavaScript Object Notation". C'est une structure de données complexe native dans le langage de programmation JavaScript et y représente habituellement un objet. C'est surtout une structure de données structurant de l'information sous la forme d'une chaîne de caractère (string). Surement en vertu de sa simplicitié, le JSON est devenu le format le plus utilisé pour représenter de l'information dans un transfert entre deux systèmes.

Programmeurs: n'assumez rien lorsqu'il s'agit de JSON. Surtout si vous ne programmez pas en JavaScript. Ce n'est pas parce que vous avez une chaîne de caractères qui ressemble à JSON que votre langage de programmation préféré va pouvoir la traiter sans un traitement préliminaire.

En JavaScript, vous avez de la chance: le langage le prend nativement en charge

let a = {"foo": "bar"};

console.log(a.foo);

// bar

L'équivalent en Python ne fonctionnera pas


a = {"foo": "bar"}

print(a.foo)

# Traceback (most recent call last):
#  File "<stdin>", line 1, in <module>
# AttributeError: 'dict' object has no attribute 'foo'

Python ne connaît pas JSON nativement, on doit importer la librairie json pour être en mesure de le manipuler dans le code

import json

json_string = '{"foo": "bar"}'

json_object = json.loads(json_string)

print(json_object["foo"])

# bar

La librairie json permet de désérialiser la chaîne de caractères "{'foo': 'bar'}" en un objet programmatique. Une fois désérialisé, le programmeur sera capable d'effectuer différentes opérations sur l'object. Opérations qui seraient beaucoup plus difficiles à effectuer directement à partir d'une chaîne de caractères !

courage ! assumez que vous serez en mesure de traiter du JSON dans la plupart des langages de programmation

La plupart des langages de programmation ont des fonctions spécialisées pour sérialiser et désérialiser le JSON. Si c'est votre première fois, alors c'est normal de galérer un peu. Il faut lire la documentation du langage et parfois faire quelques essais avant que ça fonctionne.

JSON est une façon de représenter de l'information. Il apparaît le plus sous la forme d'une chaîne de caractère (string) qui devra être désérialisé en objet pour être compris par le code.

Mais, dans votre travail quotidien, vous allez réaliser que certains programmes demandent à recevoir du JSON sous la forme d'une string, alors que d'autres exigent que vous l'ayiez désérialisé. N'assumez rien et garder l'oeil ouvert pour vous adapter.

Par exemple, cette ressource Terraform(langage de programmation utilisé pour provisionner et configurer des ressources infonuagiques) demande à recevoir un JSON sous la forme d'une string. On voit que le programmeur utilise la fonction utilitaire jsonencode pour construire un object JSON clairement indenté pour faciliter la lecture du code. Il laisse le soin au compilateur de le transformer en chaîne de caractères lors de l'exécution du code.

resource "mongodbatlas_auditing" "this" {
  enabled    = true
  project_id = module.atlas_project.id
  audit_authorization_success = true

  audit_filter = jsonencode({
    "$and" : [
      {
        "roles" : {
          "$elemMatch" : {
            "role" : "readWriteAll",
            "db" : "panamaPapers"
          }
        }
      },
      {
        "$or" : [
          {
            "atype" : "authCheck",
            "param.command" : {
              "$in" : [
                "aggregate",
                "mapReduce",
                "delete",
                "eval",
                "findAndModify",
                "insert",
                "update",
                "resetError"
              ]
            }
          },
          {
            "atype" : {
              "$in" : [
                "createCollection",
                "createDatabase",
                "createIndex",
                "renameCollection",
                "dropCollection",
                "dropDatabase",
                "dropIndex",
                "createUser",
                "dropUser",
                "dropAllUsersFromDatabase",
                "updateUser",
                "grantRolesToUser"
              ]
            }
          }
        ]
      }
    ]
  })
}