私はphp 5.4がJsonSerializableを持っていると信じていますが、これは簡単にするはずですが、私はPHP 5.3.8を使用しています。私は私が必要として、このように多くをテストし、私は私の性質は、公共持つために解決するつもりだと思いますが、これは自分のクラスのために働くように見えていませんでした:
class JSONEncoder{
public function json_encode($object){
return json_encode($this->getFields($object));
}
private function getFields($classObj){
$fields = array();
$reflect = new ReflectionClass($classObj);
$props = $reflect->getProperties();
foreach($props as $property){
$property->setAccessible(true);
$obj = $property->getValue($classObj);
$name = $property->getName();
$this->doProperty($fields, $name, $obj);
}
return $fields;
}
private function doProperty(&$fields, $name, $obj){
if (is_object($obj)){
$fields[$name] = $this->getFields($obj);
return;
}
if (is_Array($obj)){
$arrayFields = Array();
foreach ($obj as $item){
$key = key($obj);
$this->doProperty($arrayFields, $key, $item);
next($obj);
}
$fields[$name] = $arrayFields;
}
else
$fields[$name] = $obj;
}
}
出典
2012-08-06 17:54:59
Jon
私は同じことを読んで、これらのプライベートModelプロパティを回避しようとしましたが、最後にはあきらめました。私のアプリケーション内のDoctrine全体が、json_encodeを内部的に使用するExt.Direct APIによって公開されています。私の場合のモデルは自動生成されているので、シリアライザやパックメソッドで回避するのは多大な努力でした。私はそれが悪い習慣であることを知っているが、それでもそれはうまくいく。 –