Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将JSON对象映射到PHP类?_Php_Json_Api_Class_Oop - Fatal编程技术网

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

如何将JSON对象映射到PHP类?,php,json,api,class,oop,Php,Json,Api,Class,Oop,我正在构建一个RESTAPI endpint,它将一家公司添加到MySQL数据库中。客户端发送带有附加数据包的POST请求。数据包是一个JSON对象。假设JSON公司对象的格式与API使用的公司类完全匹配 如何将JSON公司对象数据获取到Company类中?实例化一个公司对象,json\u decode()json对象,然后调用几十个set()方法似乎很愚蠢 这似乎特别愚蠢,因为我正计划在我的客户机包中提供相同的模型来构建对象,这些对象在解码之前作为JSON传递给我的API,然后再次映射回相同的

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

如何将JSON公司对象数据获取到Company类中?实例化一个公司对象,
json\u decode()
json对象,然后调用几十个
set()
方法似乎很愚蠢

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


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

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


为什么不处理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;
            }
        }
    }
}

不要将获得的JSON数据与要使用的数据对象完全匹配。数据库和对象将发生更改,您不希望这些更改影响您创建的接口,反之亦然。

我们构建JSON对象是为了将JSON对象自动映射到我们自己的模型类


它只依赖于docblock类型信息进行映射,大多数类属性都有这种映射。

这一个可能会对您有所帮助

 class ObjectMapper
    {

        protected string $modelClass='';

        public function __construct(string $modelClass){
        $this->modelClass = $modelClass;
}

        protected function mapObject(array $values){
            $object = new $this->modelClass();
            foreach ($values as $key=>$value){
                $mapperFunction = 'set'.$key;
                $object->{$mapperFunction}($value);
            }
            return $object;
        }

    }


json_decode第二个参数的可能重复项必须设置为true,否则无法进行键/值迭代。我对你的答案做了修改。
 class ObjectMapper
    {

        protected string $modelClass='';

        public function __construct(string $modelClass){
        $this->modelClass = $modelClass;
}

        protected function mapObject(array $values){
            $object = new $this->modelClass();
            foreach ($values as $key=>$value){
                $mapperFunction = 'set'.$key;
                $object->{$mapperFunction}($value);
            }
            return $object;
        }

    }