2012-03-13 65 views
11

我想转换对象JSON编码数组的数组的工作,我作出这样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的大小返回正确的记录数,但在js中的值是空的,像这样[{},{},{},{}]

编辑

当我的print_r($ allVisists)brfore编码它返回

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 
     ) 

) 
+0

在调用'json_encode'之前,您是否尝试过'print_r($ allVisits)'? – jerrymouse 2012-03-13 12:15:14

+0

它正确地打印出阵列 – palAlaa 2012-03-13 12:35:14

回答

15

您正在使用json_encode与不具有任何公共成员的对象。 json_encode只适用于它可以“看到”的成员,这就是为什么这些人是空的。

自PHP 5.4,你可以使用JsonSerializable interface的控制数据将用于json_encode提供,如:

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

如果低于5.4,还可以实现该功能的W/O从展开接口,然后手动分配正确的值:

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

希望这有助于。

+0

您可以在早期版本的PHP中实现JsonSerializable – Westy92 2015-01-06 23:51:25

5

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

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

+1

同意。你会错误地不同意雷的最后一点建议。 – Jake 2012-03-13 13:00:58

4

正如Ray所说,如果您的类属性是受保护或私有的,这些将不会被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, 
     ); 
    } 
} 
+0

耶为5.4。这将清理我的内部api的六打。手指越过升级不会破坏我的服务器。 – Jake 2012-03-13 12:59:34

+0

@arraintxo我的公司正在升级到php 5.3 :(我没有得到JsonSerializable接口 – Ray 2012-03-13 13:40:39

+0

@Ray,我的解决方案允许您在早期版本的PHP中实现JsonSerialable – Westy92 2015-01-06 23:52:47

2

默认情况下,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

为什么使用数组?我想要对象 - 问题是“...对象数组” – Srneczek 2015-10-23 09:32:51

+0

关联数组,因为当您调用json_encode()时,它将转换为适当的JSON表示法对象,数组中的键将是“对象”属性名称,值将会是这些属性的值,我将用最终结果更新我的答案 – Westy92 2015-10-24 15:34:16

+0

更新我的评论:json_encode()实际上并不检查你是否传入数组或对象,所以你必须明确地将它转换为任何你需要的输出。所以数组很好,它只是PHP,我希望它更聪明,但实际上它是。 – Srneczek 2015-10-24 18:27:45

0

对于那些谁正在寻找简单的答案,不像其他复杂的答案,我是一件艺术品:

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

即使$用户> jsonSerialize()输出stdObject,json_encode是如此愚蠢的,它不知道它是对象,所以你必须明确指出(对象)明确 - 你不喜欢PHP的简单吗?

+0

这个工作到底如何? – user431806 2017-03-10 16:50:57

+0

如何工作?在PHP中投射? – Srneczek 2017-03-11 18:20:39

+0

不可以。您正在引用的Protocol :: class – user431806 2017-03-11 18:43:33