我想将对象转换为JSON,可以选择要转换的属性。
<?php
class MyObject
{
protected $id;
protected $name;
protected $sub1;
protected $sub2;
public function __construct($id, $name)
{
$this->id = $id;
$this->name = $name;
$this->sub1 = new MySubObject;
$this->sub2 = new MySubObject;
}
public function json(array $array)
{
$arrayJson = array();
foreach ($array as $value) {
$arrayJson[$value] = $this->////////// HERE /////// ;
}
return json_encode($arrayJson);
}
public function debug()
{
echo '<pre>';
var_dump($this);
echo '</pre>';
}
}
然后打电话给这样的话:
$MyObject= new MyObject(1, 'waffles');
$MyObject->debug();
echo $MyObject->json(array('id','name','sub1->x','sub2->z'));
调试输出:
object(Produto)#3 (3) {
["id":protected]=>
string(1) "1"
["name":protected]=>
string(6) "waffles"
["sub1":protected]=>
object(MySubObject)#3 (3) {
["x"]=>
1
["y"]=>
2
["z"]=>
3
}
["sub2":protected]=>
object(MySubObject)#3 (3) {
["x"]=>
1
["y"]=>
2
["z"]=>
3
}
}
我希望JSON的输出看起来像这样:
{ "id": 1, "name": "waffles", "sub1": {"x": 1}, "sub2": {"z": 3} }
我在制作'json'功能时遇到了麻烦,也许这不是最好的方法。或者你可以通过选择要转换的字段来判断是否有另一种方法将对象转换为JSON。
我忘了说对象可以在子对象中有子对象。
答案 0 :(得分:1)
您可能需要做这样的事情。注意,这应该让你开始,你可以完成它以获得你想要的确切输出:
public function json(array $array)
{
$arrayJson = array();
foreach ($array as $key => $value) {
# See if there is a relation
if(strpos($value,'->') !== false) {
# Explode and remove any empty fields
$subobjexp = array_filter(explode('->',$value));
# See if there is an internal param with this value
if(isset($this->{$subobjexp[0]})) {
# Assign a shorthand variable
$arg = $this->{$subobjexp[0]};
# If there is a second arg, try and extract
if(isset($subobjexp[1]))
$arrayJson[$subobjexp[0]][$subobjexp[1]] = (!empty($arg->{$subobjexp[1]}))? $arg->{$subobjexp[1]} : false;
}
}
else
$arrayJson[$key] = $value;
}
return json_encode($arrayJson);
}
请注意,x
和z
之类的参数需要是MySubObject
类中的公共变量,否则如果没有其他子类中的get-type方法,则无法访问它们
答案 1 :(得分:0)
Rasclatt的回答帮助我建立了这个功能。
public function json(array $array)
{
$arrayJson = array();
foreach ($array as $key => $value) {
if (strpos($value, '->') !== false) {
$subobjexp = explode('->', $value);
$arr = array();
$ref = &$arr;
while ($key = array_shift($subobjexp)) {
$ref = &$ref[$key];
}
$subobjexp = explode('->', $value);
eval("\$ref = \$this->$value;");
$arrayJson[$subobjexp[0]] = $arr[$subobjexp[0]];
} else {
eval("\$arrayJson[\$value] = \$this->$value;");
}
}
return json_encode($arrayJson);
}
当然它还需要一些抛光,我还没有用到显示错误。如果有人想表明错误或改进,谢谢。