对 PHP 中的对象使用 json_encode (不管作用域)

我试图输出对象列表作为 json,并想知道是否有一种方法,使对象可用于 json_encode?我得到的代码看起来像

$related = $user->getRelatedUsers();
echo json_encode($related);

现在,我只是对用户数组进行迭代,并单独地将它们导出到 json_encode的数组中,以便为我转换成可用的 json。我已经尝试过使对象具有可迭代性,但是 json_encode似乎无论如何都会跳过它们。

编辑 : 这里是 var _ dump () ;

php > var_dump($a);
object(RedBean_OODBBean)#14 (2) {
["properties":"RedBean_OODBBean":private]=>
array(11) {
["id"]=>
string(5) "17972"
["pk_UniversalID"]=>
string(5) "18830"
["UniversalIdentity"]=>
string(1) "1"
["UniversalUserName"]=>
string(9) "showforce"
["UniversalPassword"]=>
string(32) ""
["UniversalDomain"]=>
string(1) "0"
["UniversalCrunchBase"]=>
string(1) "0"
["isApproved"]=>
string(1) "0"
["accountHash"]=>
string(32) ""
["CurrentEvent"]=>
string(4) "1204"
["userType"]=>
string(7) "company"
}
["__info":"RedBean_OODBBean":private]=>
array(4) {
["type"]=>
string(4) "user"
["sys"]=>
array(1) {
["idfield"]=>
string(2) "id"
}
["tainted"]=>
bool(false)
["model"]=>
object(Model_User)#16 (1) {
["bean":protected]=>
*RECURSION*
}
}
}

下面是 json _ encode 给我的信息:

php > echo json_encode($a);
{}

最后我得到了这个:

    function json_encode_objs($item){
if(!is_array($item) && !is_object($item)){
return json_encode($item);
}else{
$pieces = array();
foreach($item as $k=>$v){
$pieces[] = "\"$k\":".json_encode_objs($v);
}
return '{'.implode(',',$pieces).'}';
}
}

它获取包含这些对象或单个实例的数组,并将其转换为 json-我使用它而不是 json _ encode。我确信有些地方我可以做得更好,但是我希望 json _ encode 能够检测到什么时候根据对象公开的接口来迭代对象。

139990 次浏览

对象的所有属性都是私有的,也就是... 不能在类的作用域之外使用。

PHP > = 5.4解决方案

使用新的 JsonSerializable接口提供自己的 json 表示,供 json_encode使用

class Thing implements JsonSerializable {
...
public function jsonSerialize() {
return [
'something' => $this->something,
'protected_something' => $this->get_protected_something(),
'private_something' => $this->get_private_something()
];
}
...
}

PHP < 5.4解决方案

如果您确实希望序列化您的私有和受保护的对象属性,那么您必须实现一个 JSON 编码函数 在里面 your Class,该函数在为此目的创建的数据结构上利用 json_encode()

class Thing {
...
public function to_json() {
return json_encode(array(
'something' => $this->something,
'protected_something' => $this->get_protected_something(),
'private_something' => $this->get_private_something()
));
}
...
}

更详细的报告

我通常在对象中包含一个小函数,它允许我转储到 array、 json 或 xml。比如:

public function exportObj($method = 'a')
{
if($method == 'j')
{
return json_encode(get_object_vars($this));
}
else
{
return get_object_vars($this);
}
}

不管怎样,get_object_vars()可能对你有用。

In RedBeanPHP 2.0 there is a mass-export function which turns an entire collection of beans into arrays. This works with the JSON encoder..

json_encode( R::exportAll( $beans ) );

在 PHP > = 5.4.0中,有一个用于将对象序列化为 JSON: JsonSerialalize的新接口

只需在对象中实现接口并定义一个 JsonSerializable方法,当您使用 json_encode时将调用该方法。

因此,用于 PHP > = 5.4.0的 解决方案应该是这样的:

class JsonObject implements JsonSerializable
{
// properties


// function called when encoded with json_encode
public function jsonSerialize()
{
return get_object_vars($this);
}
}

我还没有看到提到这一点,但 bean 有一个称为 getProperties()的内置方法。

因此,使用它:

// What bean do we want to get?
$type = 'book';
$id = 13;


// Load the bean
$post = R::load($type,$id);


// Get the properties
$props = $post->getProperties();


// Print the JSON-encoded value
print json_encode($props);

产出:

{
"id": "13",
"title": "Oliver Twist",
"author": "Charles Dickens"
}

现在再进一步,如果我们有一个豆子数组..。

// An array of beans (just an example)
$series = array($post,$post,$post);

然后我们可以做以下事情:

  • 使用 foreach循环遍历数组。

  • 用 bean 的属性数组替换每个元素(bean)。

所以这个..。

foreach ($series as &$val) {
$val = $val->getProperties();
}


print json_encode($series);

输出如下:

[
{
"id": "13",
"title": "Oliver Twist",
"author": "Charles Dickens"
},
{
"id": "13",
"title": "Oliver Twist",
"author": "Charles Dickens"
},
{
"id": "13",
"title": "Oliver Twist",
"author": "Charles Dickens"
}
]

希望这个能帮上忙!

对于一个对象数组,我使用了类似下面的代码,同时遵循 php < 5.4的自定义方法:

$jsArray=array();


//transaction is an array of the class transaction
//which implements the method to_json


foreach($transactions as $tran)
{
$jsArray[]=$tran->to_json();
}


echo json_encode($jsArray);

下面的代码对我很有用:

public function jsonSerialize()
{
return get_object_vars($this);
}
$products=R::findAll('products');
$string = rtrim(implode(',', $products), ',');
echo $string;

这是我的方法:

function xml2array($xml_data)
{
$xml_to_array = [];


if(isset($xml_data))
{
if(is_iterable($xml_data))
{
foreach($xml_data as $key => $value)
{
if(is_object($value))
{
if(empty((array)$value))
{
$value = (string)$value;
}
else
{
$value = (array)$value;
}
$value = xml2array($value);
}
$xml_to_array[$key] = $value;
}
}
else
{
$xml_to_array = $xml_data;
}
}


return $xml_to_array;
}