5

我正在开发一个 PHP (5.3.1) 项目,我需要将 JSON 字符串发送到 web 服务(在 python 中),但是我从 json_encode 获得的结果没有作为有效的 JSON 传递(我正在使用 JSLint检查有效性)。

我应该补充一点,我尝试编码的结构相当大(13K 编码),并且部分包含 UTF8 数据,虽然 json_encode 确实处理了它,但我在结果中奇怪的地方得到了空格。例如,我可以得到 {"hello":true} 或 {"hell o":true} ,这会导致来自 web 服务的错​​误,因为 JSON 无效(或数据,如第二个示例)。

我也尝试过使用 Zend 框架进行 JSON 编码,但这并没有太大的不同。

PHP 中的 JSON 是否存在已知问题?有没有人遇到过这种行为并找到了解决方案?

4

4 回答 4

7

你说“我试图编码的结构......部分由 UTF8 数据组成。” 这意味着它也是部分非 UTF8 数据。该json_encode文档在底部有一条评论,即

json_encode() 期望字符串被编码为 UTF8 格式,而默认情况下 PHP 字符串是 ISO-8859-1 编码的。这意味着

json_encode(array('àü'));

将产生一个空字符串的 json 表示,而

json_encode(array(utf8_encode('àü')));

将工作。

JSON 的失败段是由于非 UTF8 输入造成的吗?

于 2009-11-24T14:41:18.510 回答
6

为确保对象键不能包含空格或任何非 unicode 字符,未加引号的变量只能是布尔值、整数、浮点数、对象和数组值,字符串应始终加引号。

另外,我建议您在 json 输出之前添加正确的标头。

if(!headers_sent())
   header('Content-Type: application/json; charset=utf-8', true,200);

您还可以发布您传递给的数组或对象json_encode吗?

于 2009-11-24T14:34:27.320 回答
3

前几天我正在处理一些自动生成的电子邮件,并注意到同样的奇怪行为(在电子邮件正文中插入了空格),所以我开始检查电子邮件帖子并找到了罪魁祸首:

从 SMTP RFC2821:

包括 在内的文本行的最大总长度为 1000 个字符(不包括为透明度而复制的前导点)。

我的电子邮件正文确实在一行中,因此用 \n 打破它修复了空格问题。

于 2010-10-14T12:21:43.540 回答
1

在摸了将近一天之后,我得出的结论是问题不在 json_encode 函数中。这是我的帖子功能。

基本上, json_encode 正在准备要发送到另一个服务的数据。在今天之前,我使用 stream_context_create 和 fopen 将数据发布到外部服务,但现在我使用 fsockopen 和 fputs 并且它似乎正在工作。

虽然我不确定问题的性质,但我很高兴它现在可以工作了:)

顺便说一句:在此过程之后,我将输入和输出(均以 JSON 格式)邮寄给自己,这就是我最初看到问题的方式。这个问题仍然存在,但我想这与邮件的编码或类似的东西有关。

于 2009-11-25T13:02:49.597 回答