Résumé

  • Une requête conforme à RFC 9535 s’exécute sur une valeur JSON déterminée et produit une liste de zéro, un ou plusieurs nœuds. Chaque nœud possède un chemin normalisé unique dans cette valeur.
  • $['approvals'][3] peut désigner sans ambiguïté la quatrième approbation aujourd’hui et une autre demain si une ligne est insérée avant elle. L’unicité d’une position n’est pas la permanence d’une identité.
  • Liste vide, valeur JSON null, sélection répétée et indice hors limites sont des états distincts. Une décision sérieuse doit conserver l’entrée, la requête, l’implémentation, le résultat et la règle qui lui donne sens.

Une coordonnée ne devient pas une carte d’identité parce qu’elle est précise.

À 9 heures, $['approvals'][3] sélectionne l’approbation de Léa. À 9 h 05, une approbation antérieure est ajoutée en tête du tableau. La requête n’a pas bougé, reste valide et renvoie toujours un seul nœud ; elle sélectionne désormais Marc. Un système qui n’a gardé que la chaîne du chemin ne peut plus démontrer ce qu’il avait vu à 9 heures.

Publié sur la voie des standards de l’IETF en février 2024, RFC 9535 fixe précisément le périmètre. JSONPath évalue une requête contre une valeur JSON — l’argument de requête — puis rend une liste de nœuds. Un nœud associe une valeur à sa position dans cette entrée particulière. Le standard rend la sélection interopérable ; il n’authentifie ni le registre ni la signification métier du champ sélectionné.

Une adresse canonique, dans un instantané

Le chemin normalisé emploie une notation entre crochets et un échappement canoniques. Pour chaque nœud d’une valeur donnée, il n’en existe qu’un. C’est un excellent format pour les tests, la comparaison des résultats, le post-traitement et une déduplication explicite. Il permet de prouver quel emplacement a été choisi.

Mais il ne contient ni empreinte du document, ni version, ni provenance, ni schéma, ni identifiant métier stable. Même un indice négatif dépend de la longueur du tableau concret : son chemin normalisé inscrit la position positive qui en résulte. Modifier la longueur, c’est modifier la relation entre chemin et objet.

JSON Pointer, RFC 6901, localise lui aussi une valeur dans une structure connue ; RFC 9535 permet de convertir un chemin normalisé en pointeur. Changer de notation ne crée pas une continuité historique.

Le vide n’est pas un diagnostic unique

Une liste de nœuds vide est un résultat valide. Un indice hors limites sélectionne simplement moins de nœuds et les segments suivants restent vides. Ce cas ne doit pas être confondu avec une syntaxe invalide, un délai dépassé, une limite de ressources ou un rejet du parseur.

Il ne faut pas davantage le confondre avec null, qui est une valeur JSON présente. Un membre absent ne produit aucun nœud. Réduire les deux situations à un même booléen peut laisser le moteur parfaitement conforme tout en faussant l’autorisation.

Les doublons sélectionnés restent dans la liste et count() compte les nœuds, pas les objets métier uniques. Quand plusieurs ordres sont admis, deux évaluations peuvent produire des ordres différents mais conformes. « Prendre le premier » est donc une règle applicative, à moins qu’un contrat extérieur ne définisse l’ordre.

L’accord mécanique ne confère pas l’autorité

RFC 8259 définit JSON et signale le risque des noms de membres dupliqués. RFC 7493 resserre le profil avec I-JSON. RFC 9485 fournit le profil d’expressions régulières de match() et search(). Le registre IANA JSONPath recense les extensions, et application/jsonpath identifie les documents de requête.

Ces accords favorisent une sélection commune sur une entrée bien formée. Ils ne prouvent pas que le champ owner désigne le propriétaire légal, que le document est récent ou que sa source avait autorité. RFC 9537 illustre la limite : JSONPath peut localiser un champ masqué dans une réponse RDAP, sans révéler la valeur cachée ni attester la politique qui a permis le masquage.

La sécurité commence avant la requête

RFC 9535 met en garde contre l’exécution de fragments par le eval du langage hôte. Toute interpolation d’un nom, d’un indice ou d’une valeur comparée doit être validée et échappée. Une descente récursive naïve peut aussi subir une consommation excessive de processeur ou de pile. Grammaire correcte, ressources bornées et mode d’échec explicite vont ensemble.

RFC 3629 pour UTF-8 et les considérations de modèle de RFC 8949 stabilisent la représentation, pas la provenance. La chaîne de preuve reste : octets source, valeur analysée, requête, implémentation et extensions, liste de nœuds, interprétation, décision.

Conserver un reçu rejouable

Pour l’accès, la conformité, la politique de routage ou la réponse à incident, il faut enregistrer les octets ou leur empreinte et leur provenance ; le parseur et sa règle sur les noms dupliqués ; la requête exacte et son type de média ; les variables avant et après validation ; l’implémentation, sa version et ses extensions ; les plafonds de temps et de ressources ; les chemins normalisés et les valeurs communicables ; la déduplication et l’ordre ajoutés par l’application ; le schéma, la politique, l’acteur, l’horodatage et la décision.

Ce reçu permet d’affirmer que l’implémentation X a évalué Q sur l’entrée d’empreinte H avec les limites L. Il ne permet pas d’affirmer que le nœud est le même qu’hier sans identifiant stable au niveau du schéma.

Sources et limites

Le dossier officiel comprend le HTML, le texte, la notice RFC Editor, le Datatracker, son historique et la recherche d’errata. Le dépôt du groupe de travail documente l’élaboration ; le comparatif JSONPath éclaire la fragmentation antérieure.

Les références connexes sont RFC 8259, 7493, 9485, 6901, 8949, 3629 et 9537, ainsi que le registre IANA et le type de média. La grille de gouvernance s’appuie sur les textes de Heng Lu consacrés aux couches de réalité, à la spécification initiale minimale et à la primauté du code exécuté.

Aucune implémentation, organisation, attaque ou panne nommée n’a été auditée. L’article ne conclut ni à une faille de RFC 9535 ni à un mauvais usage particulier.