Object 2 json

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

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.