json编码不能处理对象数组

pal*_*laa 12 php encoding json zend-framework

我想将对象数组转换为json编码,我这样做

$allVisits = $mapper->getAllVisits($year, $month);
echo json_encode($allVisits);
Run Code Online (Sandbox Code Playgroud)

这是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;
}
Run Code Online (Sandbox Code Playgroud)

当我回显$ allVisits的大小时,它返回正确的记录数,但是在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
        )

)
Run Code Online (Sandbox Code Playgroud)

hak*_*kre 17

您正在使用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);
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

如果您低于5.4,您还可以实现该功能,无需从界面扩展,然后手动分配正确的值:

$visitsEntries[] = $entry->jsonSerialize();
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.


Wes*_*y92 6

默认情况下,json_encode() 仅序列化对象的公共属性。使您想要序列化的所有属性都公开不是解决方案!PHP 5.4 及更高版本具有 JsonSerializable 接口,但我为早期版本的 PHP 提出了一个简单的解决方案。

由于 JsonSerializable 只是 PHP 5.4 及更高版本的一部分,请自行创建。

if (!interface_exists('JsonSerializable')) {
   interface JsonSerializable {
      public function jsonSerialize();
   }
}
Run Code Online (Sandbox Code Playgroud)

那没那么难,是吗?现在我们可以实现 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
        );
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

现在您只需调用 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();
    ...
Run Code Online (Sandbox Code Playgroud)

然后你可以打电话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"
   },
   ...
]
Run Code Online (Sandbox Code Playgroud)


Ray*_*Ray 5

属性是私有的还是受保护的?如果是这样,json编码无法在对象内部看到它们.我通过在我的对象中创建一个'toJson'方法来解决这个问题,我需要将其序列化为json.在这个方法中,我遍历对象属性并手动构造一个通用对象,我传递给json_encode.然后我从这个方法返回Json字符串.

不要只是将所有对象属性公开!!!!


arr*_*txo 5

正如Ray所言,如果您的类属性是受保护的或私有的,则这些属性不会被json化。

由于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,
        );
    }
}
Run Code Online (Sandbox Code Playgroud)