Javascript,AJAX和& A的问题JSON

时间:2011-08-14 14:19:27

标签: php javascript ajax json xmlhttprequest

我是一名iPhone开发人员,他对网络开发很陌生,所以如果我在这里犯了愚蠢的错误,请原谅我:

我想要完成的是当用户从下拉列表中选择一个项目时,它会调用一些javascript,这会将一个AJAX请求引发到我所拥有的返回一些JSON的PHP文件。 - 该JSON包括缩略图图像文件名和图像的标题。这些需要分别传入我的文档中的图像和文本字段。

问题是,尝试评估json后失败了。 - eval(json);JSON.parse(json);也是如此。我通过调用document.write('something')来解决这个问题。定期在我的回应方法中。 - 它总是能够写到它解析json的那一点。

我确信我的PHP有效并且我的请求很好(我可以从JS中输出响应)。

以下是我在下拉列表中选择新项目时调用的函数:

function changeImage(id){
    var xmlhttp;
    if (window.XMLHttpRequest)
      {// code for IE7+, Firefox, Chrome, Opera, Safari
      xmlhttp=new XMLHttpRequest();
      }
    else
      {// code for IE6, IE5
      xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
      }
    xmlhttp.onreadystatechange=function()
    {
      if (xmlhttp.readyState==4 && xmlhttp.status==200)
        {
        var res=xmlhttp.responseText;
        var responseObject = eval(res);
        var caption = responseObject.caption;
        var textField = document.getElementById('caption');
        textField.value = caption;
        var imagePreview = document.getElementById('imgPreview');
        imagePreview.src = responseObject.filename;
        }
      }
    xmlhttp.open("GET","getCaption.php?id="+id,true);
    xmlhttp.send();
}

当我输出res(或手动访问php文件)时,JSON看起来像这样:

{"caption":"A caption","filename":"myimage_thumb.jpg"}

为什么JSON eval失败?

更新 记录此错误:SyntaxError: Parse error

5 个答案:

答案 0 :(得分:6)

您正在使用JSON字符串并假装它是一个Javascript对象文字。但是,请记住, JSON仅仅 Javascript的对象表示法命名!

然后你希望eval将直接评估这个并返回一个对象,但事实并非如此。


观察

在Firebug控制台中编写以下内容:

eval('{"caption":"A caption","filename":"myimage_thumb.jpg"}')

也会产生一个SyntaxError。 (理想情况下,你已经将问题缩小到了这个范围!)

有趣的是,更明确地构造一个对象是有效的(对于这个输入):

eval('new Object({"caption":"A caption","filename":"myimage_thumb.jpg"})')

正如强制输入成为某种表达式一样,带括号:

eval('({"caption":"A caption","filename":"myimage_thumb.jpg"})')

解释

这一切都归结于ECMAScript标准中12.4的声明:

  

请注意,ExpressionStatement无法以大括号开头,因为这可能会使其与块不一致。

This article深入解释了这个问题,但总结解决方案是使用JSON.parse(res)从JSON字符串中获取对象。这是正确的方法,只要您的输入是有效的JSON,它就不会失败。

答案 1 :(得分:1)

更改评估线:

eval('var responseObject = ' + res);

答案 2 :(得分:1)

我会在这个背景下给出一些建议

  • 您可以尝试执行console.log(res)alert(res),以便在尝试使用之前确实拥有 res。< / p>

  • 切勿使用eval(res)。为什么不使用JSON.parse(res)(在现代浏览器上,因为你的IE5浏览器太多了),甚至更好$.parseJSON(如果使用jQuery)

  • 如果您要从PHP发送if,请使用json_encode($var, JSON_HEX_TAG|JSON_HEX_APOS)来防止语法错误在解析时出现。在另一个帖子中查看我的答案(链接如下)。

    How to store a php array on the client side?

答案 3 :(得分:1)

您可能想尝试:

eval("(" + res + ")");

以便将其包裹在(...)中。我不知道为什么。

无论如何,你也可以查看jQuery,因为它就像:

一样简单
$.getJSON("path", function(json) {
    // json is the ready-to-use object
});

答案 4 :(得分:0)

这就是我使用eval的方法 -

var rsltObj = eval('(' + jsonStr + ')');