如何将JSON对象映射到PHP类?
我正在构建一个RESTAPI endpint,它将一家公司添加到MySQL数据库中。客户端发送带有附加数据包的POST请求。数据包是一个JSON对象。假设JSON公司对象的格式与API使用的公司类完全匹配 如何将JSON公司对象数据获取到Company类中?实例化一个公司对象,如何将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,然后再次映射回相同的
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;
}
}