【问题标题】:JSON Array Not Decoding With EvalJSON 数组不使用 Eval 解码
【发布时间】:2010-08-26 17:55:13
【问题描述】:

我有两个文件,一个包含通过 json_encode 编写的 PHP 数组 echoed,另一个包含网页的 javascript 函数。一个这样的功能,看起来像这样(并且未完成):

/*
 * Function: selectVictim
 * Called from function laserOn()
 *
 * Selects a random victim from a list of victims
 *
 * @return String: victim
 */
function selectVictim()
{
var params = "url=queenofsheep.com/Sheep/victims.php";
var request = new ajaxRequest();

request.open("POST", "victims.php", true);
request.setRequestHeader("Content-Type",
                             "application/x-www-form-urlencoded");
request.setRequestHeader("Content-Length", params.length);
request.setRequestHeader("Connection", "close");

request.onreadystatechange = function ()
{
    if (this.readyState == 4)
    {
        if (this.status == 200)
        {
            if (this.responseText != null )
            {
                var vicString = this.responseText;
                var vicArray = eval('"'+vicString+'"');
                //var vicArray = vicString.split(',');
                //var numVic = Math.floor(Math.random() * (vicArray - 1));
                alert(vicArray);
            }
            else alert("Ajax error: No data received");
        }
        else alert("Ajax Error: " + this.statusText);
    }
}

request.send(params);
}

应该从另一个文件中获取数组并对它做超出这个问题范围的事情。不幸的是,虽然this.responseText 包含格式为 JSON 编码的数组

var jsonArr = 
     ["1","2,","3"]

激活函数什么都不做,evaling this.responseText 产生“未定义”。

我在这里做错了什么?如果需要,我可以提供更多真实代码、实际数组的示例。这让我发疯了。

【问题讨论】:

  • 您的 JSON 输出是 var jsonArr = ["1","2,","3"] 还是 ["1","2,","3"]
  • 在响应文本周围添加引号告诉它它是一个字符串。所以评估没有结果。尝试将所有内容包装在() 中,因此:eval('("' + vicString + '")');。但是要意识到添加引号只会产生一个字符串......哦,还有Don't eval to parse JSON

标签: javascript ajax json eval


【解决方案1】:

尝试在 Eval 函数中添加“(”和“)”。这就是我过去看到的方式

var myObject = eval('(' + vicString + ')');

【讨论】:

    【解决方案2】:

    使用request 代替thisthis 指的是window 对象。

    编辑:如果var jsonArr=[1, 2, 3]; 是字面上的响应,如果您无法更改响应文本,则应使用eval(vicString+';jsonArr');

    如果您运行 'eval("var test=[1,2,3];")',您会看到它确实返回未定义。但这不是使用 JSON 的好习惯。

    【讨论】:

    • 不一定。这取决于处理程序的调用方式。如果您使用fn.apply()fn.call(),您可以设置this 的值。例如fn.call("something")this 设置为字符串"something"
    • 考虑到它会发出警报,我假设this 指的是请求对象(否则它永远不会通过if 语句,除非窗口同时具有readyStatestatus) ...
    • 在这种情况下,this 指的是window。我没有说它总是这样。
    • @ircmaxell,他没有说它放在那些 if 语句中。
    • @Lekensteyn。同样,不一定:)。 request.onreadystatechange.call("something");。我只是将this 设置为"something"。不看ajaxRequest是怎么实现的,handler是怎么调用的,没法说。
    【解决方案3】:

    将服务器中响应的内容类型设置为“application/json”,您将不再需要使用 eval。
    此外,您最好使用 ajax 框架而不是使用自己的 ajax 函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-16
      • 2013-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多