1

因此,这是将我的 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 创建一个对象(“{}”)。

4

2 回答 2

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 不允许内置函数重载,因此您必须定义具有不同名称的函数。

于 2016-11-17T01:54:36.207 回答
-1

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

if (count($_results)) {

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

    foreach ($_results as $_row) {
        $this->_response['vendor'][$_row['id']] = $_row;
    }
}
echo(json_encode($this->_response));
于 2012-12-14T03:05:45.167 回答