strip json对象的null值

Sob*_*bek 20 php json

我的所有AJAX请求都是json格式,正在javascript中解析.

如何防止在HTML页面中显示空值而无需在javascript中为每个json值编写if语句?

或者我应该编写一个自定义PHP函数来将数组编码为json而不是使用json_encode(),因此它不显示'null'?

mas*_*oud 21

在PHP的服务器端,

array_filter以前可以使用json_encode.

array_filter没有第二个参数会删除条目数组的null元素,例如:

$object= array(
             0 => 'foo',
             1 => false,
             2 => -1,
             3 => null,
             4 => ''
          );

$object = (object) array_filter((array) $object);
$result = json_encode($object);
Run Code Online (Sandbox Code Playgroud)

$result包含:

{"0":"foo","2":-1}
Run Code Online (Sandbox Code Playgroud)

如您所见,删除了null元素.

  • 感谢您的回答,但这对多维数组不起作用,删除键将导致"未定义"值 (3认同)
  • @Sobek,顺便说一句,您不能删除值并同时保留密钥。 (2认同)

Jim*_* S. 21

我将添加到已接受的答案中,因为只有拥有1维对象或数组才会有效.如果有任何数组或对象嵌套,那么为了使接受的解决方案起作用,您必须创建某种递归数组过滤器.不理想.

我和我的同事提出的最佳解决方案是在从服务器返回之前在JSON字符串上实际执行正则表达式.

$json = json_encode($complexObject);
echo preg_replace('/,\s*"[^"]+":null|"[^"]+":null,?/', '', $json);
Run Code Online (Sandbox Code Playgroud)

正则表达式将删除表单字符串中的所有位置,,"key":null包括前导逗号和键的开头之间的任何空格.它也会在"key":null,之后匹配,以确保在JSON对象的开头没有找到空值.

这不是一个理想的解决方案,但它比创建递归数组过滤器要好得多,因为对象可能有几个维度.更好的解决方案是,如果json_encode有一个标志,您可以指定是否要将空条目保留在输出字符串中.

  • 这对我有用,但我在每个 `null` 之前添加了 `?` 以说明何时设置 JSON_PRETTY_PRINT 并且键和值之间有一个空格。 (3认同)

Dan*_*ett 6

要删除唯一 NULL,但要保持FALSE,''以及0:

function is_not_null($var)
{
    return !is_null($var);
}

echo json_encode(array_filter((array) $object, 'is_not_null'));
Run Code Online (Sandbox Code Playgroud)


bai*_*liu 5

public function __toString() {
    $obj = clone $this;
    $keys = get_object_vars($obj);
    foreach ($keys as $key => $value) {
        if (!$value) {
            unset($obj->{$key});
        }
    }
    return json_encode($obj);
}
Run Code Online (Sandbox Code Playgroud)

  • 也许您可以添加一些评论和解释,请教我们!仅放置代码的附加值较少。 (3认同)