使用Prototype解析JSON结果时出现问题

时间:2009-09-24 18:28:37

标签: json prototype

我的服务返回以下JSON对象,Content-Type标头设置为“application / javascript”。根据json.org] 2的说明,它包含在parens中,但我已经尝试过使用和不使用parens。没有parens,它会通过jsonlint验证。

({"products": {"itemId": "0", "productId": "1234", "quantity": "4", "rank": "12", "subProductId": ""}, "txnId": "1"})

如果我明确评估了响应,如下所示,我没有问题:

var form = $('productListRequestForm');
form.request(
{
    onSuccess :
        function(response)
        {
            var json = eval(response.responseText);
            rebuildWishlistTable(json);
        },
    onFailure :
        function(response)
        {
            alert("AJAX request failed: " + response.responseText);
        }
});

但是,如果我依赖Prototype解析响应并将解析后的结果作为第二个参数传递给我的函数,如下所示,该值始终为null。根据{{​​3}},这应该有效。有什么我想念的东西,或者他们遗失的东西吗?

   var form = $('productListRequestForm');
    form.request(
    {
        onSuccess : function(response, json)
            {
                rebuildWishlistTable(json);
            },
        onFailure :
            function(response)
            {
                alert("AJAX request failed: " + response.responseText);
            }
    });

2 个答案:

答案 0 :(得分:1)

它看起来像Prototype中的一个错误。

在版本1.6.1的第1497行,有以下代码:

  var contentType = response.getHeader('Content-type');
  if (this.options.evalJS == 'force'
      || (this.options.evalJS && this.isSameOrigin() && contentType
      && contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i)))
    this.evalResponse();

请注意,evalResponse()的返回不会执行任何操作。如果我们转到该函数的定义:

  evalResponse: function() {
    try {
      return eval((this.transport.responseText || '').unfilterJSON());
    } catch (e) {
      this.dispatchException(e);
    }
  },

在Prototype网站上发布了一个错误,并且关闭了我对JSON有“几个误解”的评论,并且不应该使用错误报告系统来获取帮助。好笑,我以为我指的是他们扔掉了返回值的地方。

如果其他人可能有类似的情况,我正在编辑我的问题,以显示有效的代码,但不会有效,并接受这个答案。

答案 1 :(得分:0)

用括号括起来

eval("({\"products\"": {\"itemId\": \"0\", \"productId\": \"1234\", \"quantity\": \"4\", \"rank\": \"12\", \"subProductId\": \"\"}, \"txnId\": \"1\"})")

这对你有用