1

我有一些类似于此的 PHP 5 代码:

$result = myFunction(...);  // return false, or doit action
$reply = array();
if ($result) {
   $reply['doit'] =  $result;
   $reply['status'] = "a status html string";
} else {
   $reply['content'] = "Some html text";
   $reply['menu'] = "Some other html text";
   $reply['status'] = "a different status html string";
}
return $reply;

调用者包括片段

$reply = somefunction();
echo json_encode($reply);

然后这个回复被发送到客户端,在那里 jquery 将它传递给我的函数

function handleReply(reply) {
    if (reply.doit) {
        handle action
    }
    if (reply.content) document.getElementById('content').innerHTML=reply.content;
    if (reply.menu) document.getElementById('menu').innerHTML=reply.menu;
    if (reply.status) document.getElementById('status').innerHTML=reply.status;
}

我一直在努力解决的是,当执行 if 语句的 doit 分支时,($result 是一个字符串)jquery 给我的回复是一个字符串。当采取内容/菜单/状态方面($result 为 false)时,回复是一个对象。

我在数组中添加了第二个索引,结果是一样的。虽然所有字符串都是 ASCII 我尝试通过 UTF8_encode 传递它们。我已将“doit”索引的名称从“action”更改为以防触发 jquery 中的某些行为。

为了清楚起见,错误时的回复是(例如)。

"{"doit":"obj=session&act=show&ID=3","status":"<p>Nic: Ian<br\/>Reseller: Coachmaster.co.uk<br\/>Status: SysAdmin <\/p>"}"

这是一个字符串。我期望:

{"doit":"obj=session&act=show&ID=3","status":"<p>Nic: Ian<br\/>Reseller: Coachmaster.co.uk<br\/>Status: SysAdmin <\/p>"}

这是一个对象/数组。这也是我的日志记录显示的内容。

我在windows 7和Apache下使用php5.4.3,在linux和nginx下使用php 5.3.10,结果相同。jquery 都是 v1.7.2 版本。还加载了 jQuery UI - v1.10.3 - 2013-07-02。

如果它是 jquery 中的一个错误,那就是一个非常奇怪的错误。我该如何证明呢?

4

4 回答 4

4

我认为您依赖 jQuery 自动检测。尝试:

header('Content-Type: application/json');
于 2013-07-30T14:18:25.263 回答
0

将字符串转换为 JavaScript 后,您必须eval()将其转换为 JSON 对象:

var reply_json = eval( reply );

然后您可以访问reply_json.contentreply_json.menu等。

显然要小心你正在评估的内容,确保它来自受信任的来源等等。

于 2013-07-30T14:11:56.927 回答
0

也许你可以试试:

jQuery.parseJSON()

于 2013-07-30T14:14:25.373 回答
0

你使用$.getJSON()jquery方法还是$.ajax()

使用$.ajax()方法时,如果在发出ajax请求时不指定dataType: "json"选项,jQuery将使用“智能猜测”(通过搜索响应MIME类型)来计算如何解释服务器响应(xml、html、plain、json对象。 ..)。如果无法自动计算,它将假定响应是纯文本,并且将在成功句柄中返回常规字符串。

您应该使用$.getJSON()或指定dataType: "json"

$.ajax({
    url: "....",
    dataType: "json",
    success: function(reply) { // success handle
        // if not specifying dataType: "json",
        // and if not using response headers to specify MIME type "application/json", 
        // reply will not be object but a string!
    }
});

或者,正如 Marek 在他的回答中发布的那样,在响应标头中指定 MIME 类型。

于 2013-07-30T14:43:21.867 回答