2013-06-19 127 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类型信息进行映射,而大多数类属性都有。