PHP:如何将对象转换为数组并保留带命名空间的数组字段名称索引?

3
我有一个这样的类:
namespace backoffice\controller;

class MyObject{
   private $id;
   private $name;
}

我尝试将它转换成数组,然后转换成 JSON 数组:
$obj = new MyObject();
$obj->setId(1);
$obj->setName('Test');

json_encode((array)$obj);

我得到了这个结果:
{"backoffice\controller\MyObject\id":"1","backoffice\controller\MyObject\name":"测试"}!!! 编辑:
为什么我无法获得这个结果:
{"id":"1","name":"Test"}

你有什么问题? - Daan
@Daan 抱歉,我编辑了问题,请看一下。 - SlimenTN
因为你正在使用命名空间...这就是原因。 - Marc B
@MarcB 那么我就无能为力了吗? - SlimenTN
在文档中看不到任何忽略/跳过命名空间的选项...请注意,您的(array)类型转换基本上是无意义的。您正在使用字符串键,这意味着您必须使用JS对象来存储数据。数组不能有命名键。 - Marc B
顺便提一下,您展示的Json输出不正确,因为当您将私有属性强制转换时,生成的数组键将添加空字节。更可能的输出是{"\u0000backoffice\\controller\\MyObject\u0000id":1,"\u0000backoffice\\controller\\MyObject\u0000name":"Test"} - Gordon
1个回答

3

不要将其转换为数组(这将执行您不希望的操作),而是让您的MyObject实现JsonSerializable接口。

namespace backoffice\controller;

class MyObject implements \JsonSerializable
{
   private $id;
   private $name;

   public function jsonSerialize() {
       return get_object_vars($this);
   }

   // setters
}

然后您可以直接使用json_encode将其转换为JSON格式并获得所需的结果:
$obj = new MyObject;
$obj->setId(1);
$obj->setName('foo');
echo json_encode($obj); // {"id":1,"name":"foo"}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接