PHP中的空数组 - > JSON - > JS = Javascript中的空数组。如何获得空对象?

时间:2012-12-14 02:53:11

标签: php associative-array json

因此,这是将我的JSON响应构建回JS的基础。

$this->_response['vendor'] = array();

foreach ($_results as $_row) {
    $this->_response['vendor'][$_row['id']] = $_row;
}

echo(json_encode($this->_response));

这很好并且在javascript中构建对象,除非没有结果。在这种情况下,php将其视为空数字数组,而不是关联数组。然后归结为javascript并转换为空数组而不是空对象。

我知道我可以通过检查事物,在javascript中预先声明变量作为对象等多种方式解决这个问题。我想知道是否有办法在php中声明一个空的关联数组,或者另一种强制json_encode来创建对象(“{}”)的方法。

2 个答案:

答案 0 :(得分:0)

这是PHP的一个已知限制 - 因为它本身不支持JavaScript类型(例如对象),解码然后再次编码可能会导致数据丢失。

我使用这样的解决方法来保持JSON:

/**
 * @param $input
 * @return array
 */
public static function safeDecode($input) {
    // Fix for PHP's issue with empty objects
    $input = preg_replace('/{\s*}/', "{\"EMPTY_OBJECT\":true}", $input);

    return json_decode($input, true);
}

/**
 * @param array|object $input
 * @return string
 */
public static function safeEncode($input) {
    return preg_replace('/{"EMPTY_OBJECT"\s*:\s*true}/', '{}', json_encode($input));
}

它不理想但它有效。请注意,您可以:

  • json_decode()到对象,这是默认方式。然后空对象不会丢失,但大多数现代框架都需要数组,因为大多数集合处理工具都可以使用数组。因此,在大多数情况下,它不是一个可行的选择;
  • 您可以强制json_encode()将空数组编码为对象,但之后您将丢失空数组 - 这也不是一个不错的选择。

因此,上面所示的像我这样的工作可能是目前唯一的选择。简而言之,您必须扩展PHP json_encode()和json_decode()。不幸的是,PHP不允许内置函数重载,所以你必须定义不同名称的函数。

答案 1 :(得分:-1)

我想这里最合理的答案是,首先提供空数组或对象可能没有意义。然后,简单检查javascript中是否存在就可以解决问题了。

if (count($_results)) {

    $this->_response['vendor'] = array();

    foreach ($_results as $_row) {
        $this->_response['vendor'][$_row['id']] = $_row;
    }
}
echo(json_encode($this->_response));