JeuWeb - Crée ton jeu par navigateur
Utiliser json_encode et json_decode plutôt que explode - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Utiliser json_encode et json_decode plutôt que explode (/showthread.php?tid=900)

Pages : 1 2


Utiliser json_encode et json_decode plutôt que explode - Sephi-Chan - 24-12-2010

Hello,

Dans les jeux par navigateur, il arrive qu'on souhaiter stocker des informations sans structure particulière. Souvent, les développeurs débutants font ça en formatant les informations sous forme d'une chaîne de caractères, en utilisant une notation de leur cru, par exemple :


attaque:10|defense:10|vie:100

Puis après, ces développeurs disent : on va utiliser explode pour récupérer les informations !
En fait, c'est une bien mauvaise idée.

Cette façon de stocker des données sous forme d'une chaîne existe depuis longtemps. Ça s'appelle la sérialisation (aussi appelé marshalling) et il y a déjà des outils pour faire.

Parmi ces outils il y a JSON (http://json.org/), qui permet de représenter des données sous forme d'objet Javascript. L'avantage de JSON (par rapport à une sérialisation maison) est qu'il supporte les nombres, les chaînes, les valeurs null, les booléen, les tableaux et les hash (tableau associatif).

Par exemple, l'équivalent des informations données plus haut sous forme d'une chaîne pourrait être :


{
"attaque": 10,
"defense": 10,
"vie": 100
}


L'autre avantage de JSON, c'est que tous les langages savent le produire. Dans le cas de PHP, il y a même des fonctions natives (donc performantes) pour produire du JSON (retourné sous forme d'une chaîne de caractère). Exemple :


$attributes = array(
'attaque' => 10,
'defense' => 10,
'vie' => 100
);

echo json_encode($attributes);

M'affiche à l'écran :


{"attaque":10,"defense":10,"vie":100}


Et on peut très facilement faire l'inverse, transformer cette chaîne en un objet (de la classe StdClass) ou un tableau :


$attributes_as_json_string = '{"attaque":10,"defense":10,"vie":100}';
$attributes = json_decode($attributes_as_json_string, true); // true pour obtenir un tableau au lieu d'un objet.
print_r($attributes);

Nous donne :


Array
(
[attaque] => 10
[defense] => 10
[vie] => 100
)


Et tout ça, sans avoir à se soucier de la manière dont nous récupérons nos données ! Ça peut être des tableaux imbriqués, des entiers, des true, des false, etc. Ça fonctionne !

Voilà pourquoi je vous suggère d'oublier explode et d'utiliser json_encode/json_decode. Smile


Pour compléter ça, il faudrait fournir des cas d'utilisations de telles données : il ne faut pas utiliser cette technique pour tout et n'importe quoi. Souvent, il est plus pertinent d'utiliser des colonnes appropriées dans la table ou une relation many-to-many.


Sephi-Chan


RE: Utiliser json_encode et json_decode plutôt que explode - Globe - 24-12-2010

Merci beaucoup Sephi, très instructif pour les mecs comme moi qui codent pas des masses et qui n'ont jamais vraiment suivi de cours =)


RE: Utiliser json_encode et json_decode plutôt que explode - Sephi-Chan - 24-12-2010

Hélas, c'est pas le genre de truc qu'on apprend en cours. Ce qui vient des cours est rarement utile… -.-


Sephi-Chan


RE: Utiliser json_encode et json_decode plutôt que explode - atra27 - 24-12-2010

Sinon y a la fonction serialize() en php

C'est natif a php, sa existait avant json et sa garde toutes les propriétés des valeurs du tableau, même si c'est un objet...
Donc si c'est pour stocker quand on doit le retraiter ensuite par php, c'est la meilleure solution.
Si c'est pour traiter ensuite en JS, json est bien mieux.

A juger au cas par cas.


RE: Utiliser json_encode et json_decode plutôt que explode - djidi - 24-12-2010

C'est d'ailleurs ce que je me demandais.
Quel est le plus performant entre serialise et json_encode ?


RE: Utiliser json_encode et json_decode plutôt que explode - Sephi-Chan - 24-12-2010

En fait, serlialize n'est bon que pour sérialiser des objets, afin de récupérer la classe de l'objet.
Pour le reste (des tableaux, des chaînes, des hash, etc.), passer par JSON est plus intéressant pour plusieurs raisons :
  • La sérialisation JSON est plus rapide (pour un même tableau, sur 10 millions d'itérations) :

    array(1, 4, array('foo' => 'bar'));
    • 5,69 secondes pour json_encode ;
    • 10,74 secondes pour serialize ;

  • La chaîne produite est plus courte.
    • [1,4,{"foo":"bar"}] en JSON ;
    • a:3:{i:0;i:1;i:1;i:4;i:2;a:1:{s:3:"foo";s:3:"bar";}} avec serialize ;

  • JSON est un format universel ;


Sephi-Chan


RE: Utiliser json_encode et json_decode plutôt que explode - djidi - 24-12-2010

Ok merci.


RE: Utiliser json_encode et json_decode plutôt que explode - Holy - 05-01-2011

Faut quand même préciser que json_encode et json_decode ne fonctionnent qu'avec un encodage en UTF-8. Ce qui peut être très problématique.

Sinon en termes de perf, je me souviens que si globalement les méthodes json étaient plus rapides, c'était surtout à l'encodage ou au décodage (l'une des deux opérations donc) et que ça dépendait aussi de la taille du tableau à sérialiser.

Donc prudence quand même, même si c'est intéressant Wink

A titre perso, j'utilise depuis très longtemps serialize(), je serais bien passé au json si c'était pas encodé obligatoirement en UTF-8.


RE: Utiliser json_encode et json_decode plutôt que explode - Viciousity - 05-01-2011

Ben l'UTF-8 est presque une norme maintenant ... :S


RE: Utiliser json_encode et json_decode plutôt que explode - Holy - 05-01-2011

(05-01-2011, 02:39 AM)Viciousity a écrit : Ben l'UTF-8 est presque une norme maintenant ... :S
Dans le monde francophone, y a encore beaucoup de personnes qui ont des bases de données en iso et dont les pages sont de l'iso. Il vaut mieux le savoir quand on veut utiliser json ^^