json_encode($ Object)不想透露我的整个对象

时间:2012-06-08 05:56:51

标签: php ajax json

我们的PHP应用程序与胡子模板库结合使用了很多json_encode($ myObject)。这很棒。

麻烦的是,当从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中的所有null属性。有没有其他人有这个问题和一个很好的清洁解决方案?

3 个答案:

答案 0 :(得分:2)

您应该调整服务器端代码以忽略空值并仅返回设置的字段(从而避免不必要的带宽使用)。
在您的客户端代码中,我建议您为模板设置一组默认值,并使用默认值扩展它们 我使用的是jquery,代码看起来像这样:

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

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

foreach($obj as $k => $v)
    if($v == null)
        unset($obj[$k]);

答案 1 :(得分:0)

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

答案 2 :(得分: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;
  }