【问题标题】:PHP json_encode returning empty sctructurePHP json_encode 返回空结构
【发布时间】:2016-02-24 21:30:18
【问题描述】:

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

【问题讨论】:

    标签: php json


    【解决方案1】:

    问题是您的输出包含三个具有私有和受保护属性的对象。

    看这个例子

    <?php
    
    class sampleClass
    {
        private $hello = 25;
    }
    
    
    $class = new sampleClass();
    
    echo json_encode($class);
    
    ?>
    

    输出将是 {}

    在您的情况下,您有三个 {} 对象的数组 [],它们是空的,因为它们的所有属性都是私有的或受保护的。

    但如果您将对象属性更改为公开,public $hello = 25; 则输出将是

    {"hello":25}
    

    【讨论】:

    • @Andreas 我在 stackoverflow 中的第一个答案))
    • (我的意思是你最先回答这个问题)
    • @user777 刚刚意识到您编写的方法是指属性/属性,不是吗? ;)
    • 在考虑了属性/属性后,我选择了this。亲爱的主 ....!!所以总是很有趣!
    • 来自 Java,这是一场噩梦!但完全合乎逻辑!
    【解决方案2】:

    你有受保护的和私有的属性,所以你不能使用任何函数,包括 json_encode() 来直接访问你的对象的属性。

    使用JSONSerialize

    【讨论】:

      【解决方案3】:

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

      更新

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

      无论如何,如果您想公开对象的所有属性,您的函数中的代码可能是这样的:

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

      函数的完整签名被故意省略了,因为你应该根据你的上下文决定你想要做什么(我在发布这个之前有考虑,但我希望这样的批评会最小化)这个例子也可能是被认为是不好的,因为它暴露了所有东西(你可以考虑创建一个只包含你想要暴露的属性的关联数组)

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

      working example

      【讨论】:

        猜你喜欢
        • 2016-06-02
        • 1970-01-01
        • 2016-08-25
        • 2012-03-20
        • 2015-09-29
        • 2015-10-23
        • 2015-06-12
        • 2012-10-17
        • 2017-02-21
        相关资源
        最近更新 更多