代码之家  ›  专栏  ›  技术社区  ›  kdgregory

用原型分析JSON结果时出现问题

  •  0
  • kdgregory  · 技术社区  · 16 年前

    我的服务返回以下JSON对象,内容类型头设置为“application/javascript”。根据json.org上的说明,它用parens包装] 2 但是我试过有无帕伦斯。没有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 docs ,这应该有效。有什么东西是我找不到的,还是他们找不到的?

       var form = $('productListRequestForm');
        form.request(
        {
            onSuccess : function(response, json)
                {
                    rebuildWishlistTable(json);
                },
            onFailure :
                function(response)
                {
                    alert("AJAX request failed: " + response.responseText);
                }
        });
    
    2 回复  |  直到 16 年前
        1
  •  1
  •   kdgregory    16 年前

    它看起来像原型中的一个bug。

    在第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);
        }
      },
    

    在原型站点上发布了一个bug,它被关闭了,评论说我对JSON有“几个误解”,不应该使用bug报告系统寻求帮助。有趣的是,我想我是在指出他们把回报值扔到哪里去了。

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

        2
  •  0
  •   Rodrigo    16 年前

    用括号括起来

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

    那对你有用