PHP json_encode返回空结构

时间:2015-11-22 20:28:56

标签: php json

我正在调用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;
}

3 个答案:

答案 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())直接访问对象的属性。

使用JSONSerialize

答案 2 :(得分:0)

它是因为它们不公开如果你想要json_encode私有/受保护变量,你必须实现自己的JSON序列化。

<强>更新

你可以谨慎考虑jsonserializable(php 5.4+)!!!!!!! 假设您要在响应某些http请求时序列化对象的私有/受保护属性,但在其他情况下,您可能不希望序列化这些属性,或者您可能已经运行了代码(甚至第三方),假设它们不是

无论如何,如果你想暴露你所有对象的属性,你的功能中的代码可能是这样的:

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

该功能的完整签名是故意遗漏的,因为你应该根据你的背景决定你想做什么(我在发布之前有考虑但我希望这样批评将被最小化)这个例子也可能是被认为是坏的,因为它暴露了一切(你可以考虑创建一个只包含你想要暴露的属性的关联数组)

我再次表达了我的所有考虑因素,因为一些SO成员将例子视为完全成熟的解决方案并进行投票,因为你并非如此。是的,您应该根据应用程序的上下文来考虑您想要做什么,这就是您可以做的事情(而不是您应该做的事情)。

working example