PHP->JSON->JS=Javascript中的空数组。如何取而代之的是空对象?

PHP->JSON->JS=Javascript中的空数组。如何取而代之的是空对象?,php,associative-array,json,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将其视为空数值数组,而不是关

因此,这里是将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创建一个对象{}相反。

我认为最合理的答案是,首先交付空数组或对象可能没有意义。简单地检查javascript中是否存在,就可以解决这个问题

if (count($_results)) {

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

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

这是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_解码为对象,这是默认方式。空对象不会丢失,但大多数现代框架都需要数组,因为大多数集合操作工具都使用数组。因此,在大多数情况下,这不是一个可行的选择; 您可以强制json_encode将空数组编码为对象,但这样会丢失空数组,这也不是一个好的选择。
因此,像上面所示的工作环境可能是目前唯一的选择。简而言之,您必须扩展PHPs json_编码和json_解码。不幸的是,PHP不允许内置函数重载,因此您必须用不同的名称定义函数。

如果您有PHP 5.3,应该这样做,尽管我认为我从未验证过它是否也适用于空对象。是的,我验证过它会起作用。echo json_encodearray,json_FORCE_对象;打印{}嗯,很有趣,但是$this->\u响应中还有其他数组应该保持为空数组。