2

我们的 PHP 应用程序大量使用了 json_encode($myObject) 以及 mustache 模板库。这很棒。

麻烦的是,当从 ajax 请求返回 json 数据时,它揭示了我们对象的整个结构,即使我们没有为它们分配数据。一个简单的例子:

通过 ajax 获取用户并让服务器返回带有 json_encode($user) 的对象

json:

"_userID":"1","_password":null,"_avatar":"0000723_8949d1d7eb0214fdf6c1af3cb6b66ed3_a.jpg","_blocked":null,"_confirmed":null,"_registerDate":null,"_lastVisitDate":null,"_template":null,"_referrerUserID":null,"_referrerURL":null,"_referrerDomain":null,"_referrerSearchTerms":null,"_confirmationHash":null,"_type":"Administrator"等等...

当我只想返回几个字段时,它揭示了我们的对象的很多信息。

显然,我可以重写我们的服务器端代码以发送回一个数组或不同的对象,这些对象更受限制,但实际上这使生活变得更加困难,并且有点妨碍我们处理与服务器相同的对象的干净模板设计。

如何清除 json_encode 中的所有空属性。有没有其他人有这个问题和一个好的和干净的解决方案?

4

3 回答 3

2

您可能应该调整您的服务器端代码以忽略空值并仅返回设置的字段(从而避免不必要的带宽使用)。
在您的客户端代码中,我建议您为模板设置一组默认值,并使用默认值扩展它们接收到的 JSON。
我希望您使用 jquery,代码如下所示:

var defaults ={someDay:"somePlace"};
var object = $.extend({},defaults,theJson);   

更新
并为了“清理” php 中的对象,您可以执行以下操作:

foreach($obj as $k => $v)
    if($v == null)
        unset($obj[$k]);
于 2012-06-08T06:13:43.287 回答
0

根据我在处理对象和 JSON 时的经验,我认为没有一种方法可以不迭代每个值。我总是发现在类中实现一个 _toJson 方法会更好,并且在将其编码为 JSON 之前做所有必要的准备(utf8 编码问题,使用 getter 而不是直接调用变量等)。

于 2012-06-08T06:18:50.107 回答
0

感谢@gion_13,我修改了他的代码并提出了一个完整的解决方案:

$output = array('data'=>$data,'template'=>$template);
$output = object_unset_nulls($output);
echo json_encode($output);


function object_unset_nulls($obj)
  {
    $arrObj = is_object($obj) ? get_object_vars($obj) : $obj;
    foreach($arrObj as $key => $val)
    {
      $val = (is_array($val) || is_object($val)) ? object_unset_nulls($val) : $val;
      if (is_array($obj))
        $obj[$key] = $val;
      else
        $obj->$key = $val;
      if($val == null)
        unset($obj->$key);
    }
    return $obj;
  }
于 2012-06-11T02:52:07.823 回答