我正在调用json_encode将一个对象数组发送回用户,并且在我的代码的其他部分它正常工作,但是在这一部分它返回一个空的结构字符串。
以下是在编码之前在数组上调用json_encode时的结果:
array(3) {
[0]=>
object(MinaProxy)#5 (7) {
["carregado":"MinaProxy":private]=>
bool(true)
["link":"MinaProxy":private]=>
int(1)
["idMina":protected]=>
int(1)
["qntOuro":protected]=>
int(2000)
["x":protected]=>
int(307)
["idPartida":protected]=>
int(1)
["proximo":protected]=>
int(1)
}
[1]=>
object(MinaProxy)#6 (7) {
["carregado":"MinaProxy":private]=>
bool(true)
["link":"MinaProxy":private]=>
int(2)
["idMina":protected]=>
int(2)
["qntOuro":protected]=>
int(2000)
["x":protected]=>
int(512)
["idPartida":protected]=>
int(1)
["proximo":protected]=>
int(2)
}
[2]=>
object(MinaProxy)#7 (7) {
["carregado":"MinaProxy":private]=>
bool(true)
["link":"MinaProxy":private]=>
int(3)
["idMina":protected]=>
int(3)
["qntOuro":protected]=>
int(2000)
["x":protected]=>
int(716)
["idPartida":protected]=>
int(1)
["proximo":protected]=>
NULL
}
}
这是json_encode之后的结果:
[{},{},{}]
可以注意到,原始数组中没有特殊字符,所以我认为这不是编码问题。 这是我调用json_encode的代码:
elseif($dados['acao'] == 'recuperarMinas') {
$i = 0;
$array = array();
while ($this->partida->minas->temProximo()) {
$array[$i] = $this->partida->minas->getProximoAvancando();
$array[$i]->getIdPartida();
$i++;
}
$_SESSION['partida'] = $this->partida;
$retornoJson = json_encode($array);
return $retornoJson;
}
答案 0 :(得分:4)
问题是你的输出有三个具有私有和受保护属性的对象。
参见此示例
<?php
class sampleClass
{
private $hello = 25;
}
$class = new sampleClass();
echo json_encode($class);
?>
输出将是{}
在你的情况下,你有三个{}对象的array [],它们是空的,因为它们的所有属性都是私有的或受保护的。
但是如果要将对象属性更改为公共,public $hello = 25;
则输出
{"hello":25}
答案 1 :(得分:1)
您拥有protected和private属性,因此您无法使用任何函数(包括json_encode())直接访问对象的属性。
答案 2 :(得分:0)
它是因为它们不公开如果你想要json_encode私有/受保护变量,你必须实现自己的JSON序列化。
<强>更新强>
你可以谨慎考虑jsonserializable(php 5.4+)!!!!!!! 假设您要在响应某些http请求时序列化对象的私有/受保护属性,但在其他情况下,您可能不希望序列化这些属性,或者您可能已经运行了代码(甚至第三方),假设它们不是
无论如何,如果你想暴露你所有对象的属性,你的功能中的代码可能是这样的:
public function somethinghere() {
return get_object_vars($this);
}
该功能的完整签名是故意遗漏的,因为你应该根据你的背景决定你想做什么(我在发布之前有考虑但我希望这样批评将被最小化)这个例子也可能是被认为是坏的,因为它暴露了一切(你可以考虑创建一个只包含你想要暴露的属性的关联数组)
我再次表达了我的所有考虑因素,因为一些SO成员将例子视为完全成熟的解决方案并进行投票,因为你并非如此。是的,您应该根据应用程序的上下文来考虑您想要做什么,这就是您可以做的事情(而不是您应该做的事情)。