Object 2 json

Soyez le premier à donner votre avis sur cette source.

Vue 11 079 fois - Téléchargée 255 fois

Description

Si vous ne conaissez pas json, mais qu'ajax vous tient a coeur, vous DEVEZ vous y interesser :)

json est un format de serialization d'objects disons... simple, et lisible, en javascript, ca s'evalue en une ligne simple de code...

var json=eval("("+jsoncode+")");

c'est vraiment simple...

ici, j'ai une class qui gere les exceptions, une interface qui permet de dire quelles classes sont convertibles en json, et une class qui contient la gestion du tout

Source / Exemple :


<?php
/**

  • @file JsonSerializa.php
  • @brief un exemple de code de conversion d'objets ou de variable d'une maniere plus generale, en json
  • /
/**
  • @brief l'Exception
  • @author coucou747 <coucou747@hotmail.com>
  • @version 1.0
  • @date 09-10-2007
  • /
class JsonException extends Exception{ } /**
  • @brief l'interface qui doit etre implementee par les classes de tout object qui veut avoir une representation json
  • @author coucou747 <coucou747@hotmail.com>
  • @version 1.0
  • @date 09-10-2007
  • /
interface JsonAble{ //! la fonction qui permet d'avoir l'equivalent de l'objet en json public function ToJson(); } /**
  • @brief un exemple d'object qui implemente JsonAble
  • @author coucou747 <coucou747@hotmail.com>
  • @version 1.0
  • @date 09-10-2007
  • /
class A implements JsonAble{ //! la fonction qui permet d'avoir l'equivalent de l'objet en json public function ToJson(){ return '{"test":'.JsonSerialize::SerializeVAR($this->str).'}'; } //! un exemple public $str='test'; } /**
  • @brief la classe qui contient de quoi faire la conversion Variable php vers Json String.
  • @author coucou747 <coucou747@hotmail.com>
  • @version 1.0
  • @date 09-10-2007
  • /
class JsonSerialize{ /* public static function SerializeINT($v){ return $v; } public static function SerializeSTRING($v){ return '"'.str_replace(array('"', '\\'), array('\\"', '\\\\'), $v).'"'; } public static function SerializeBOOL($v){ return $v?'true':'false'; } public static function SerializeNULL($v){ return 'null'; }*/ /**
  • @brief fonction de conversion d'une chaine
  • @param $v la valeur a convertir
    • /
public static function SerializeSTRING($v){ settype($v, 'string'); return json_encode($v); } /**
  • @brief fonction de conversion d'un array
  • @param $v le tableau a convertir
    • /
public static function SerializeARRAY($v){ $out='['; foreach ($v as $k=>$s){ $out.=self::SerializeVAR($s).', '; } $out=substr($out, 0, strlen($out)-2); $out.=']'; return $out; } /**
  • @brief fonction de conversion d'un object
  • @param $v l'object a convertir
  • @exception JsonException si l'object n'implemente pas JsonAble
    • /
public static function SerializeOBJ($v){ if ($v instanceof JsonAble){ return $v->ToJson(); }else{ throw new JsonException('Object ne peut-etre converti en donnees json'); } } /**
  • @brief fonction de conversion d'une hashmap (ca se fait comme un object)
  • @param $v la hashmap a convertir
    • /
public static function SerializeHASHMAP($v){ $out='{'; foreach ($v as $k=>$s){ $out.=self::SerializeSTRING($k).':'.self::SerializeVAR($s).', '; } $out=substr($out, 0, strlen($out)-2); $out.='}'; return $out; } /**
  • @brief dit si le parametre est une hashmap
  • @param $v tableau
  • @bug $v doit-etre un tableau ou assimile, sinon, ca va provoquer plein de notices
    • /
private static function isHashMap($t){ foreach ($t as $a=>$b){ if (gettype($a)!='integer') return true; } return false; } /**
  • @brief fonction de conversion d'une variable
  • @param $v la valeur a convertir
    • /
public static function SerializeVAR($v){ $t=gettype($v); if ($t=='object'){ return self::SerializeOBJ($v); }else if ($t=='array'){ if (self::isHashMap($v)) return self::SerializeHASHMAP($v); else return self::SerializeARRAY($v); }else{ return json_encode($v); } /*else if ($t=='integer'){ return self::SerializeINT($v); }else if ($t=='string'){ return self::SerializeSTRING($v); }else if ($t=='boolean'){ return self::SerializeBOOL($v); }else if ($t=='NULL'){ return self::SerializeNULL($v); }*/ } } $array=array( 'test'=>array(1, 2, 3, "test", "test", NULL, false, true, new A()), 'test' ); $str=JsonSerialize::SerializeVAR($array); ?> <html> <head> </head> <body> <script type="text/javascript"> window.onload=function(){ var json=(<?php echo $str; ?>); printr=function(obj){ var div, ul, i; div=document.createElement("div"); div.innerHTML="typeof = " + typeof(obj); ul=document.createElement("ul"); for (i in obj){ if (i!="printr"){ li=document.createElement("li"); ul.appendChild(li); try{ if (typeof(obj[i])=="object" && obj[i]!=null){ li.innerHTML=i+" => "; li.appendChild(printr(obj[i])); }else{ li.innerHTML=i+" => "+obj[i]; } }catch (e){ li.innerHTML=e; } } } div.appendChild(ul); return div; } document.body.appendChild(printr(json)); } </script> </body> </html>

Conclusion :


il existe deux fonctions de base de php (5) pour gerer json, seulement elles ne permettent pas de personaliser selon le type d'object (on peut alors passer tout plein de choses inutiles)

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
39
du coup t'as pas note :(
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
39
c'est directement inspire du modele de serialization en java :

public class ... implements Serializable {
private void writeObject(ObjectOutputStream out) throws IOException {...}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {...}
}
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Hello,

l'idée est de toute manière très bonne.
Je n'ai pas encore testé pour essayer de voir ce que ton typage induit exactement, donc je ne note pas tout de suite. Mais en tous cas, améliorer l'implémentation du json dans php est une bonne chose à l'heure de la mode du web 2.0 ;-)
Sinon, c'est très bien codé, évidemment.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.