从PHP返回数组时出现Ajax解析错误

10

我已阅读了大部分关于此问题的SA问题,但没有一个能解决我的问题。

以下代码将JavaScript数组传递给PHP5。这非常有效,但当我将PHP数组返回到ajax代码时,

parserror: unexpected token "[" is returned. 

JavaScript

        $(function () {
            translate($("h1,p"));
            function translate(selection$) {
                var elements = [];
                for (i = 0; i < selection$.length; i++) {
                    elements.push(selection$.get(i).outerHTML);
                }
                var jString = JSON.stringify(elements);
                $.ajax({
                    url: 'test.php',
                    type: 'post',
                    data: { 'data': jString },
                    cache: false,
                    dataType: 'json',
                    success: function (data, status) {
                        $("#after").append(data);
                    },
                    error: function (xhr, desc, err) {
                        alert("Details: " + desc + "\nError: " + err + "\n" + xhr.responseText);
                    }
                }); // end ajax call
            }
        });

传递的数组字符串为

["jQuery Translator","Hello World"]

PHP

编辑

完整的 PHP 代码如下:

<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

if('POST' == $_SERVER['REQUEST_METHOD'])
{
    include 'HttpTranslator.php';
    include 'AccessTokenAuthentication.php';
    if (!empty($_POST['data'])) {
        $elements = json_decode($_POST['data']);
    }
    $auth = new AccessTokenAuthentication();
    $authHeader=$auth->authenticate();
    $fromLanguage = "en";
    $toLanguage   = "es";
    $contentType  = 'text/html';
    $category     = 'general';
    //Create the Translator Object.
    $translatorObj = new HTTPTranslator();
    foreach ($elements as $element) {
        $params =   "text=".urlencode($element)."&to=".$toLanguage."&from=".$fromLanguage;
    $translateUrl =  "http://api.microsofttranslator.com/v2/Http.svc/Translate?$params";
        //Get the curlResponse.
        $curlResponse = $translatorObj->curlRequest($translateUrl, $authHeader);    
        //Interprets a string of XML into an object.
        $xmlObj = simplexml_load_string($curlResponse);
        $translated = array();
        foreach((array)$xmlObj[0] as $val){
            array_push($translated, $val);
        }
        header('Content-type: application/json');
        var_export($translated);
    }
}

?>

xhr.responseText是

"["<h1>jQuery Traductor<\/h1>"]["<p>Hola mundo<\/p>"]"

这对我来说看起来不像JSON。虽然我不是PHP5专家,但怀疑我没有正确填充数组。任何帮助都将不胜感激。


请执行var_export($translated);而不是echo json_encode($translated);, 然后发布结果。 - Tomás
谢谢Tomas,返回的信息是:详情:解析器错误 错误:语法错误:意外的令牌a数组(0 => 'jQuery Traductor',)数组(0 => 'Hola mundo',) - ron tornambe
我们能看到更多的PHP代码吗?似乎echo json_encode($translated);被执行了两次。这是唯一的方法来生成一个由两个json数组组成的字符串:"[...][...]"。 - Tomás
我认为你在这里做对了,Tomas。我会修改代码并进行测试。 - ron tornambe
1个回答

4
移动

标签


  header('Content-type: application/json');
    var_export($translated);

在$elements的foreach之外。也需要在$elements的foreach之前初始化$translated = array();
像这样:
$translated = array();
foreach ($elements as $element) {
    $params =   "text=".urlencode($element)."&to=".$toLanguage."&from=".$fromLanguage;
    $translateUrl =  "http://api.microsofttranslator.com/v2/Http.svc/Translate?$params";
    //Get the curlResponse.
    $curlResponse = $translatorObj->curlRequest($translateUrl, $authHeader);    
    //Interprets a string of XML into an object.
    $xmlObj = simplexml_load_string($curlResponse);

    foreach((array)$xmlObj[0] as $val){
        array_push($translated, $val);
    }

}

 header('Content-type: application/json');
 var_export($translated);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接