在PHP中隐藏类变量,这样它就不会显示在JSON输出中


Hide class variable in PHP so it is not shown in JSON output

如果我在PHP 5.5中有这个代码/类,我会把它放在JSON数组中:

# Define the class
class Equip {
  public $var1 = null;
  public $var2 = null;
}
# For debugging purpose only - specify what should be shown
$show_var1 = false;
$show_var2 = true;
while loop ...
  # Initialize a new class member
  $equip = new Equip();
  # Only populate the variable if it should be shown
  if($show_var1) {
    $equip->var1 = $var1;
  }
  # Only populate the variable if it should be shown
  if($show_var2) {
    $equip->var2 = $var2;
  }
  # Populate the JSON array
  $jsonArr[] = $equip;
end while ...
# Output the JSON encoded array
echo json_encode($jsonArr, JSON_PRETTY_PRINT | JSON_NUMERIC_CHECK);

它将产生此输出(var1始终为NULL):

[
  {
    "var1": null,
    "var2": 656978
},
{
    "var1": null,
    "var2": 136981
}
]

如何隐藏var1变量以避免其进入JSON输出?

查看JsonSerializable接口,该接口在PHP>=5.4中可用。

如果让类实现JsonSerializable,则可以实现jsonSerialize()方法来只返回应该编码的数据。

class Equip implements JsonSerializable {
    public $var1 = null;
    public $var2 = null;
    public function jsonSerialize() {
        $out = array();
        if (!is_null($this->var1)) $out['var1'] = $this->var1;
        if (!is_null($this->var2)) $out['var2'] = $this->var2;
        return $out;
    }
}

一种方法是使用array_filter()来删除NULL或false元素。这应该有效:

# Populate the JSON array
$jsonArr[] = array_filter($equip);

有关详细信息,请参阅array_filter()文档。请记住,如果没有传入回调,则任何计算结果为FALSE的值都将被删除,因此,如果您计划将布尔值存储在$var1或$var2中,则此解决方案将不起作用。

注意:我确实认为@jcsanyi的解决方案是最好的,但我认为这可能是最简单的解决方法。