为什么空白字符串的json_encode将其添加到数组中?

时间:2016-07-20 16:40:06

标签: php json simplexml

我已经在PHP 5.6上克服了这种行为(在PHP 5.4中也是相同的,直到7.0)。

$note = new SimpleXMLElement('<Note></Note>');
$note->addChild("string0", 'just a string');
$note->addChild("string1", "abc\n\n\n");
$note->addChild("string2", "\tdef");
$note->addChild("string3", "\n\n\n");
$note->addChild("string4", "\t\n");

$json = json_encode($note, JSON_PRETTY_PRINT);

print($json);

输出:

{
    "string0": "just a string",
    "string1": "abc\n\n\n",
    "string2": "\tdef",
    "string3": {
        "0": "\n\n\n"
    },
    "string4": {
        "0": "\t\n"
    }
}

这种行为背后一定有理由,我想了解。而且,如果你知道一种方法来强制它对文本和空格字符串的行为方式相同,我将非常感谢你分享你的想法!

编辑。这是您可以运行的代码段:http://sandbox.onlinephpfunctions.com/code/d797623553c11b7a7648340880a92e98b19d1925

1 个答案:

答案 0 :(得分:1)

这来自RFC 4627(强调我的)

  

所有Unicode字符都可以放在引号中,但必须转义的字符除外:引号,反向固定和控制字符(U + 0000到U + 001F) )

换行符(\n)在UTF-8中为U+000A,因此PHP尽职地将其转换回各自的JS等价物

PHP将此RFC用于json_encode

  

PHP实现了原始»RFC 4627中指定的JSON超集 - 它还将编码和解码标量类型和NULL。

正如我在评论中所提到的,PHP的所有版本(返回5.2)都是这样做的(Demo