如何将JSON对象映射到PHP类?

T. *_*nes 10 php oop api json class

我正在构建一个REST API endpint,它将公司添加到MySQL数据库中.客户端发送带有附加数据包的POST请求.数据包是JSON对象.假设JSON公司对象的格式与API使用的公司类完全匹配.

如何将JSON公司对象数据导入公司类?实例化公司对象(json_decode()JSON对象)然后调用许多set()方法似乎很愚蠢.

这似乎特别愚蠢,因为我计划在我的客户端包中提供相同的模型来构建在解码之前作为JSON传递给我的API的对象,并再次映射回相同的对象.

我错过了什么吗?在构建我的API时,我经常遇到似乎多余的事情,但也许这就是必须发生的事情.

km6*_*zla 13

为什么不处理Company对象的构造函数中的所有内容,以便传入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;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


cwe*_*ske 8

我们构建了JsonMapper来自动将JSON对象映射到我们自己的模型类.

它只依赖于docblock类型信息进行映射,无论如何大多数类属性都有.


Jos*_*ski 3

为什么不在 Company 对象中创建一个方法来声明该对象的变量(您不需要为每个变量编写一个 set 方法,只需一个可以设置所有变量的方法)。

//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;
   }
}
Run Code Online (Sandbox Code Playgroud)

  • json_decode 的第二个参数必须设置为 true,否则无法进行键/值迭代。我对你的答案进行了编辑。 (3认同)