我们的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属性。有没有其他人有这个问题和一个很好的清洁解决方案?
答案 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;
}