Я полагаю, что в 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;
}
}