繁体   English   中英

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

[英]Empty array in PHP -> JSON -> JS = empty array in Javascript. How to get empty Object instead?

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

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

我想这里最合理的答案是,最初交付空数组或对象可能没有意义。 简单检查javascript中是否存在即可解决该问题。

if (count($_results)) {

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM