JSON кодировать не работает с массивом объектов - PullRequest
11 голосов
/ 13 марта 2012

Я хочу преобразовать массив объектов в кодировку json, я делаю так:

$allVisits = $mapper->getAllVisits($year, $month);
echo json_encode($allVisits);

и вот метод getAllVisists

 function getAllVisits($year, $month) {
    $where = array(
        'year = ?' => $year,
        'month = ?' => $month
    );
     $resultSet = $this->getDbTable()->fetchAll( $where);
    $visitsEntries = array();
    foreach ($resultSet as $row) {

        $entry = new Visits_Model_Visit();
        $entry->setId($row->visit_id)
                ->setDay($row->day)
                ->setDate($row->date)
                ->setTarget($row->target)
                ->setStatus($row->visit_status)
                ->setTime($row->visit_time);

        $visitsEntries[] = $entry;
    }
    return $visitsEntries;
}

, когда я отображаю размер $ allVisits itвернуть правильное количество записей, но в js значения получаются пустыми, как это [{}, {}, {}, {}]

Редактировать

Когда яprint_r ($ allVisists), прежде чем кодировать его, возвращает

Array
(
    [0] => Visits_Model_Visit Object
        (
            [day:private] => sunday
            [date:private] => 2012-03-06
            [target:private] => شسي
            [id:private] => 1
            [status:private] => 0
            [time:private] => 12:00:00
        )

    [1] => Visits_Model_Visit Object
        (
            [day:private] => sunday
            [date:private] => 2012-03-06
            [target:private] => clinnics
            [id:private] => 4
            [status:private] => 0
            [time:private] => 00:00:00
        )

    [2] => Visits_Model_Visit Object
        (
            [day:private] => Tuesday
            [date:private] => 2012-03-06
            [target:private] => clinnics
            [id:private] => 5
            [status:private] => 0
            [time:private] => 00:00:00
        )

    [3] => Visits_Model_Visit Object
        (
            [day:private] => Wednesday
            [date:private] => 2012-03-28
            [target:private] => ??????? ???????
            [id:private] => 7
            [status:private] => 0
            [time:private] => 12:00:00
        )

)

Ответы [ 5 ]

16 голосов
/ 13 марта 2012

Вы используете json_encode с объектами, которые не имеют открытых членов. json_encode работает только на тех элементах, которые он может "видеть", поэтому они пусты.

Начиная с PHP 5.4, вы можете использовать интерфейс JsonSerializable для управления тем, какие данные будут предлагаться для json_encode, например ::

class Visits_Model_Visit implements JsonSerializable {
    ...
    public function jsonSerialize() {
        return (object) get_object_vars($this);
    }
    ...
}

Если вы ниже 5.4, вы также можете реализовать эту функцию, не выходя из интерфейса и затем назначая правильное значение вручную:

$visitsEntries[] = $entry->jsonSerialize();

Надеюсь, это поможет.

5 голосов
/ 13 марта 2012

Являются ли свойства частными или защищенными для объекта?Если это так, jsoncode не видит их внутри объекта.Я обхожу это путем создания в моих объектах метода toJson, который мне нужно сериализовать в json.В этом методе я обхожу свойства объектов и вручную создаю общий объект, который передаю в json_encode.Затем я возвращаю строку Json из этого метода.

Не просто делайте все свойства вашего объекта общедоступными !!!!

4 голосов
/ 13 марта 2012

Как говорит Рэй, если ваши свойства класса защищены или закрыты, они не будут jsoned.

Начиная с PHP 5.4 вместо использования метода toJson с комментариями, у вас есть возможность указать, какие данные будут сериализованы с использованием интерфейса JsonSerializable, поэтому json_encode знает, как с этим работать.

/* PHP >= 5.4 only */
class Visits_Model_Visit implement JsonSerializable {
    public function jsonSerialize()
    {
        return array(
             'day' => $this->day,
             'date' => $this->date,
             'target' => $this->target,
             'id' => $this->id,
             'status' => $this->status,
        );
    }
}
2 голосов
/ 07 января 2015

По умолчанию json_encode () сериализует только открытые свойства объекта. Обнародование всех свойств, которые вы хотите сериализовать, - НЕ решение! PHP 5.4 и более поздние версии имеют интерфейс JsonSerializable, но я предлагаю простое решение для более ранних версий PHP.

Поскольку JsonSerializable является только частью PHP 5.4 и более поздних версий, создайте его самостоятельно.

if (!interface_exists('JsonSerializable')) {
   interface JsonSerializable {
      public function jsonSerialize();
   }
}

Это было не так сложно, правда? Теперь мы можем реализовать JsonSerializable, не беспокоясь о том, какую версию PHP мы используем!

class Visits_Model_Visit implements JsonSerializable {
    ...
    // Only put properties here that you want serialized.
    public function jsonSerialize() {
        return Array(
           'day'    => $this->day,
           'date'   => $this->date,
           'target' => $this->target,
           'id'     => $this->id,
           'status' => $this->status,
           'obj'    => $this->obj->jsonSerialize(), // example for other objects
           'time'   => $this->time
        );
    }
    ...
}

Теперь вы можете просто вызвать jsonSerialize (), чтобы получить ассоциативный массив, который вы можете кодировать с помощью json_encode().

    ...
    $entry = new Visits_Model_Visit();
    $entry->setId($row->visit_id)
          ->setDay($row->day)
          ->setDate($row->date)
          ->setTarget($row->target)
          ->setStatus($row->visit_status)
          ->setTime($row->visit_time);

    $visitsEntries[] = $entry->jsonSerialize();
    ...

Затем вы можете позвонить json_encode($visitsEntries), чтобы получить желаемый результат.

[
   {
      "day":"sunday",
      "date":"2012-03-06",
      "target":"\u0634\u0633\u064a",
      "id":1,
      "status":0,
      "time":"12:00:00"
   },
   {
      "day":"sunday",
      "date":"2012-03-06",
      "target":"clinnics",
      "id":4,
      "status":0,
      "time":"00:00:00"
   },
   ...
]
0 голосов
/ 23 октября 2015

Для тех, кто ищет простой ответ , в отличие от других сложных ответов, мое произведение искусства:

json_encode(array(
    Protocol::PARAM_CODE => Protocol::CODE_SUCCESS,
    Protocol::PARAM_USER => (object)$user->jsonSerialize()
));

Даже когда $ user-> jsonSerialize () выводит stdObject, json_encodeнастолько глуп, что даже не подозревает, что это объект, поэтому вы должны заявить, что явно с приведением его к (объект) - разве вы не любите PHP за его простоту?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...