2013-06-19 94 views
7

我正在構建一個將公司添加到MySQL數據庫的REST API endpint。客戶端發送帶有附加數據包的POST請求。數據包是一個JSON對象。假設JSON公司對象被格式化爲與API使用的公司類完全匹配。如何將JSON對象映射到PHP類?

如何獲取JSON公司對象數據到公司類中?實例化一個公司對象,JSON對象,然後調用幾十個方法,似乎很愚蠢。

這似乎特別愚蠢,因爲我打算在我的客戶端軟件包中提供相同的模型,以便在解碼之前構建以JSON形式傳遞給我的API的對象,並再次映射回相同的對象。

我錯過了什麼嗎?在構建我的API時,我經常碰到看起來多餘的東西,但也許這就是發生的事情。

+0

[json \ _decode to custom class]的可能重複(http://stackoverflow.com/questions/5397758/json-decode-to-custom-class) – cweiske

回答

1

爲什麼不在公司對象中聲明變量(不需要爲每個變量寫一個set方法,只需要設置所有變量)就可以在Company對象中創建一個方法。

//Why not write something like this in the class 
function setFromJSON($json){ 
    $jsonArray = json_decode($json, true); 
    foreach($jsonArray as $key=>$value){ 
     $this->$key = $value; 
    } 
} 
+1

json_decode的第二個參數必須設置爲true,否則你不能做鍵/值迭代。我編輯了你的答案。 – NobleUplift

+0

是真的,我編輯過它。感謝您的保存。 –

10

你爲什麼不處理是所有的公司對象的構造,讓你在JSON對象作爲參數傳遞和構造處理所有任務的。這樣你甚至不需要公共設置方法。

$companyData = $_POST['company']; 
//or $companyData = json_decode($_POST['company']); 
//or whatever depending on how you are posting 

class Company { 
    private $companyName; 
    //etc... 
    function __construct(array $data) { 
     foreach($data as $key => $val) { 
      if(property_exists(__CLASS__,$key)) { 
       $this->$key = $val; 
      } 
     } 
    } 
} 
1

不匹配您準確獲取的JSON數據與要使用的數據對象。數據庫和對象將發生變化,您不希望這些變化影響您創建的界面,反之亦然。

5

我們構建了JsonMapper以將JSON對象自動映射到我們自己的模型類上。

它只依靠docblock類型信息進行映射,而大多數類屬性都有。