Las propiedades que se pueden codificar usando json_encode() deben ser públicas, eso resume bastante tu problema actual. 
 
En tu caso yo tendría un método público que me entregue todos estos datos, para mantener la visibilidad.  
 Código PHP:
    echo json_encode($obj->to_a());