2012-03-13 98 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