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)
希望这可以帮助.
默认情况下,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)
属性是私有的还是受保护的?如果是这样,json编码无法在对象内部看到它们.我通过在我的对象中创建一个'toJson'方法来解决这个问题,我需要将其序列化为json.在这个方法中,我遍历对象属性并手动构造一个通用对象,我传递给json_encode.然后我从这个方法返回Json字符串.
不要只是将所有对象属性公开!!!!
正如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)