Support de JSON dans PHP

Une compagne de FUD relaie depuis quelques jours une information erronée sur la suppression du support de JSON dans PHP 5.5.

Il me semble donc important d'essayer de clarifier les choses.

L'extension PECL json offre depuis 2006 le support du format JSON. Cette extension a été intégrée dans PHP 5.2.0.

Il n'y a aucun projet de supprimer ce support de PHP.

Documentation : Notation Objet JavaScript

Exemple d'utilisation de json_encode :

php -r 'var_dump(json_encode(array("foo","bar")));'
string(13) "["foo","bar"]"

Exemple d'utilisation de json_decode :

php -r 'var_dump(json_decode("[\\"foo\\",\\"bar\\"]"));'
array(2) {
  [0] =>
  string(3) "foo"
  [1] =>
  string(3) "bar"
}

Lors d'une revue de licence, le projet Debian a découvert un problème dans cette extension et l'a rapporté au projet PHP (Bug #63520). En effet le code provenant de json.org n'est pas libre, car il contient une restriction contraire à la liberté 0 (exécution pour tous les usages) : "The Software shall be used for Good, not Evil". (Inutile de discuter ce fait, la FSF a statué dans ce sens, et cet avis est suivi par la plupart des distributions Linux).

J'ai pu rapidement libérer la partie encodage en PHP 5.4.10 en supprimant le code non-libre et inutile (Bug #63588).

Pour l'analyseur, j'ai commencé l'écriture d'une nouvelle extension PECL jsonc utilisant la bibliothèque libre json-c (sous license MIT). Le code de l'encodeur est identique à celui de PHP 5.5. Ce développement a été l'occasion de contribuer directement à la bibliothèque :

  • PR51 : profondeur dynamique de l'analyseur (inclus en 0.11)
  • PR52 : analyse des nombres flottants indépendante de la locale (inclus en 0.11)
  • PR90 : les entiers ne peuvent commencer par zéro (accepté)
  • PR94 : les chaines entre apostrophe ne sont ps autorisées (en cours)
  • PR94 : les commentaires ne sont pas autorisés
  • PR94 : les caractères supplémentaires après les données ne sont pas autorisés
  • etc

L'extension jsonc remplace de manière transparente l'extension non libre.

La bibliothèque json-c offrant un analyseur incrémental, j'en ai profité pour enrichir l'extension de cette fonctionalité.

Exemple d'utilisation de la classe JsonIncrementalParser :

$parser = new JsonIncrementalParser();
$fic = fopen("somefile.json", "r");
do {
    $buf = fgets($fic);
    $ret = $parser->parse($buf);
} while ($buf && ($ret==JsonIncrementalParser::JSON_PARSER_CONTINUE));
$result = $parser->get();

On peut aussi analyser directement un fichier sans le charger en mémoire :

$ret = $parser->parseFile("somefile.json");
$result = $parser->get();

L'analyseur dispose aussi de 2 modes de sévérité, le mode strict, utilisé par défaut, et proche de celui originel de PHP et un mode standard plus permissif, qui autorise, par exemple, les commentaires ou des listes mal construites. L'utilisation de la nouvelle option JSON_PARSER_NOTSTRICT  permet d'accepter par exemple le fichier de configuration suivant (ce qui peut être utile) :

/*
Configuration file
*/
{
    "temp": "/tmp", // directory
    "debug": true,  // boolean
}

Actuellement, avec la version 1.3.1 (beta), il reste quelque différences détectées par la suite de tests de l'extension originale qui sont corrigées dans la version 1.3.2 (stable) en cours de préparation et qui devrait sortir très prochainement.

Le seule différence restant est l'implémentation partielle de l'analyse des grands entiers (et de l'option JSON_BIGINT_AS_STRING). Elle ne fonctionnera que pour les versions 32bits et pour les entiers pouvant être représentés sur 64bits (non gérés par PHP, donc récupérés en chaine ou en nombre flottant). Sachant qu'aucun encodeur ne générera ces valeurs, cela ne me semble pas un problème critique.

Les performances sont un peu moins bonnes (2 fois plus lent) mais moins de 1/10 de seconde pour analyser les données de 130000 entrées semble largement acceptable (voir résultats).

Distributions Linux

Debian a supprimé l'extension non libre à partir de PHP 5.5 / Jessie et fournit désormais le paquet php5-json (installé par défaut) construit à partir des sources de l'extension jsonc.

Fedora a supprimé l'extension non libre à partir de PHP 5.5 / Fedora 19 et fournit désormais le paquet php-pecl-jsonc (installé par défaut).

Mageia a remplacé, dans PHP 5.5, l'extension non libre par l'extension jsonc (commit 442375).

Ubuntu a supprimé l'extension non libre à partir de PHP 5.5 / Saucy et fournit désormais le paquet php5-json.

Si vous avez des informations concernant les autres distributions, merci de me le signaler que je corrige ce billet.

Conclusion

Quelque soit la méthode d'installation de PHP ou le système utilisé, le support de JSON sera présent.

Vus : 1659
Publié par Remi Collet : 73