Является ли этот JSON правильным, и если да, то как перебирать каждый объект в JavaScript - Asp .Net 3.5 - PullRequest
0 голосов
/ 20 августа 2009

Я создал веб-сервис C #, который извлекает таблицу данных с 2 столбцами, эта таблица данных сериализуется с помощью JavaScriptSerializer.

Используя FireBug, я вижу следующий JSON, который мне кажется правильным:

"{"d":"[{\"Text\":\"4 blah blah2\",\"Value\":\"16\"},{\"Text\":\"asdf\",\"Value\":\"15\"},{\"Text\":\"qwerty\",\"Value\":\"13\"}]"}"

На стороне клиента я получаю объект, как и ожидалось, используя этот вызов:

 $.ajax({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            url: "../../Services/Filter.asmx/GetComboBoxContents",
            data: '{ strFilter: "' + selText + '" }',
            datatype: "json",
            success: function(result) { onGetComboBoxOneContents(result); },
            fail: function(result) { alert(result); }
        });

Как и ожидалось, вызывается функция onGetComboBoxOneContents (msg), я пробовал множество способов, но не могу разрешить отдельные элементы. Вот последняя версия:

function onGetComboBoxOneContents(msg) {
    var evalResult = eval("(" + msg + ")");

    var cbo = getComboFilterOneObject;
    ClearComboBox(cbo);

    for (var i = 0; i < evalResult.d.length; i++) {
        AddToComboBox(cbo, evalResult.d[i].Value, evalResult.d[i].Text);
    }
}

Цель функции - проанализировать из JSON каждую пару значений и текста и отправить ее в отдельную функцию. Так как я использую .Net 3.5, ожидается d.

Любая помощь очень ценится.

РЕДАКТИРОВАТЬ: я обновил код на стороне клиента ниже, однако msg.d [i] .Value и msg.d [i] .Text в цикле по-прежнему не определены.

function onGetComboBoxOneContents(msg) {

    var cbo = getComboFilterOneObject;
    ClearComboBox(cbo);

    for (var i = 0; i < msg.d.length; i++) {
        AddToComboBox(cbo, msg.d[i].Value, msg.d[i].Text);
    }
}

РЕДАКТИРОВАТЬ: Я получил его на работу, но он все еще требует от меня использовать eval, вот мое решение, которое работает для меня:

function onGetComboBoxOneContents(msg) {
    var evalResult = eval(msg.d);

    var cbo = $("#" + getComboFilterOneObject);
    ClearComboBox(cbo);

    for (var i = 0; i < evalResult.length; i++) {
        AddToComboBox(cbo, evalResult[i].Value, evalResult[i].Text);
    }
    cbo.initializeOptionList();
}

Ответы [ 2 ]

1 голос
/ 20 августа 2009

Поскольку вы используете jQuery и указываете тип результата как json, вам не нужно ничего анализировать или оценивать, jQuery безопасно оценит ответ как JSON и вернет объект JavaScript.

По вашему обратному вызову вы можете получить доступ непосредственно к объекту, например:

function onGetComboBoxOneContents(msg) {
    var cbo = getComboFilterOneObject;
    ClearComboBox(cbo);

    for (var i = 0; i < evalResult.d.length; i++) {
        AddToComboBox(cbo, msg.d[i].Value, msg.d[i].Text);
    }
}

Редактировать: Теперь я вижу, в чем проблема, JavaScript чувствителен к регистру, в вашем Ajax-запросе вы устанавливаете опцию типа данных, а не data T ype, поэтому jQuery возвращаю вам строку:

 $.ajax({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            url: "../../Services/Filter.asmx/GetComboBoxContents",
            data: '{ strFilter: "' + selText + '" }',
            dataType: "json",
            success: function(result) { onGetComboBoxOneContents(result); },
            fail: function(result) { alert(result); }
        });
0 голосов
/ 20 августа 2009

Возможно, вы захотите взглянуть на это руководство, поскольку, как упоминалось в CMS, jQuery сделает за вас основную работу.

http://blog.reindel.com/2007/10/02/parse-json-with-jquery-and-javascript/

Если вы хотите выполнить синтаксический анализ самостоятельно, я не большой поклонник использования eval, но предпочитаю некоторую защиту, обеспечиваемую библиотеками, найденными по адресу http://json.org/,, если вам нужно выполнить любой анализ json в .net сторона.

Если вы используете firebug, просто пройдитесь по циклу и посмотрите на значения результатов json. Отладчик - лучшая часть firebug, IMO. :)

...