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());