JSON вернул данные в формате {d: "data"} - PullRequest
2 голосов
/ 30 ноября 2010

Я пытаюсь получить код автозаполнения JQueryUI, работающий с веб-сервисом ASMX. Я уже близко, но вчера ударил еще одну стену. Данные 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 ]

2 голосов
/ 01 декабря 2010

Ваши данные должны выглядеть так:

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

Похоже, вы пропустили кавычки вокруг вашего "d", и у вас есть дополнительные кавычки вокруг вашего массива.

Не проверяйте () ваши данные - это открывает вам больше проблем безопасности, чем предотвращено d: .. У вас должен быть доступ к JSON.parse () или, если нет, jQuery.parseJSON () (который включает JSON.parse (), если доступно ... зависит от вашей целевой платформы (платформ)).

0 голосов
/ 01 декабря 2010

Если вы используете службу WCF JSON с webHttpBehavior (вместо enableWebScriptBehavior), она не будет выдавать «d»

0 голосов
/ 01 декабря 2010

Это был невероятно сложный процесс, но я наконец-то заработал. Было много препятствий: 1) Моя возвращаемая строка JSON была завернута в бланк XML, поэтому она не будет анализироваться 2) Для решения этой проблемы требуется строка contentType: 'application / json' 3) С этим типом контента требуется POST. ПОЛУЧИТЬ не будет работать 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
    });

Если у меня когда-нибудь возникнут такие большие проблемы с написанием нескольких строк кода, я собираюсь взять очень большой дробовик на мой компьютер!

Боб Джонс

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...