JSON以{d:“data”}格式返回数据

时间:2010-11-30 16:53:18

标签: json jquery-ui autocomplete

我试图让JQueryUI的自动完成代码与ASMX Web服务一起使用。我越来越近了,但是昨天打了另一面墙。 JSON数据以{d:“data”}格式返回(请参阅http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx)。我的数据现在看起来像:

d: "[{"DOTNumber":"001061010","JobTitle":"Project Architect"},{"DOTNumber":"003061005","JobTitle":"Principal Electrical Engineer"}]"

我的代码是:

$(function() {
    function log(message) {
        $("<div/").text(message).prependTo("#log");
        $("#log").attr("scrollTop", 0);
    }
});

$("#dotmatch").autocomplete({
    source: function(request, response) {
        $.ajax({
            type: "POST",
            url: "/AutoSuggestJSTest/AutoSuggest.asmx/DOTFind",
            contentType: 'application/json',
            dataType: "json",
            data: JSON.stringify({ prefixText: request.term, count: 20 }),
            error: function(XMLHttpRequest, textStatus, errorThrown) {
                alert(textStatus);
            },
            success: function(data) {
                var safe = data;
                response($.map(safe.d, function(item) {
                    return {
                        label: item.JobTitle + "(" + item.DOTNumber + ")",
                        value: item.DOTNumber
                    }
                }));
            }
        });
    },
    minLength: 2,
    select: function(event, ui) {
        log(ui.item ?
                "Selected: " + ui.item.value + " aka " + ui.item.id :
                "Nothing selected, input was " + this.value);
        $get("DOTNumber").value = ui.item.value;
    },
});

问题在于成功功能。

通过“d”问题的正确语法是什么?

3 个答案:

答案 0 :(得分:2)

您的数据应如下所示:

{"d":[{"DOTNumber":"001061010","JobTitle":"Project Architect"},"DOTNumber":"003061005","JobTitle":"Principal Electrical Engineer"}]}

看来你的“d”周围缺少引号,你的数组周围有额外的引号。

不要eval()您的数据 - 这会让您面临更多安全问题而不是d:阻止..您应该有权访问JSON.parse()或者如果不是jQuery.parseJSON()(它包含JSON。 parse()如果可用...取决于您的目标平台)。

答案 1 :(得分:0)

这是一个非常困难的过程,但我终于开始工作了。有许多障碍: 1)我的JSON返回字符串被包装在XML毯子中,所以它不会解析 2)解决此问题需要contentType:'application / json'行 3)使用该内容类型,需要POST。 GET不起作用 4)POST需要使用JSON.stringify将数据放在一起。我仍然不确定这个,但我在某个地方发现了一些代码。 5)从POST返回的数据前缀为“d”(参见:http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx) 6)访问数据本身需要“eval(data.d)”行。

   $("#dotmatch").autocomplete({
        source: function(request, response) {
            $.ajax({
                type: "POST",
                url: "/AutoSuggestJSTest/AutoSuggest.asmx/DOTFind",
                contentType: 'application/json',
                dataType: "json",
                data: JSON.stringify({ prefixText: request.term, count: 20 }),
                success: function(data) {
                    var output = eval(data.d);
                    response($.map(output, function(item) {
                        return {
                            label: item.JobTitle + "(" + item.DOTNumber + ")",
                            value: item.DOTNumber
                        }
                    }));
                },
                error: function(XMLHttpRequest, textStatus, errorThrown) {
                    alert(textStatus);
                }
            });
        },
        minLength: 2
    });

如果我再次编写几行代码时会遇到这么多麻烦,我将把一把非常大的霰弹枪带到我的电脑上!

Bob Jones

答案 2 :(得分:0)

如果您使用带有webHttpBehavior的WCF JSON服务(而不是enableWebScriptBehavior),它将不会发出“d”