JQuery и анализ JSON в обратном вызове - PullRequest
2 голосов
/ 21 февраля 2010

Я использую jQuery для вызова asmx и возврата некоторых данных. Я звоню вот так

function getRequestInfo(event) {
        var id = $('#<%= RequestDaysId.ClientID %>').val();
        var formattedId = "{'id': '115'}";
        $.ajax({
            type: "Post",
            url: "services/VacationServices.asmx/GetVacationInfo",
            data: "{'id': '" + id + "'}",
            dataType: "json",
            contentType: "application/json; charset=utf-8",
            processdata: true,
            success: function(data) {
                $('#<%=Note.ClientID %>').val(data.Note);
                $('.pendingrequestinfo').show().fadeIn(2000);
            },
            error: function(result, errortype, exceptionobject) {
                $('.failureMessage').fadeIn(2000).fadeOut(2000);
            }
        })
    };

Кажется, все работает нормально, я установил точку останова в своей функции успеха, проверил объект данных и увидел это.

"{"Note":"this is a note","dayInfo":[{"ShortDate":"3/4/2010","DayType":"Vacation","HalfDay":""},{"ShortDate":"3/5/2010","DayType":"Vacation","HalfDay":""}]}"

Проблема возникает, когда я пытаюсь получить значения из JSON. Если я делаю что-то вроде data.Note, я получаю неопределенный обратно.

Уже поздно, сегодня суббота, и я занимался этим весь день, я уверен, что хотел бы получить толчок в правильном направлении, когда дело доходит до анализа моего JSON.

EDIT: Я использую Asp.net и JavaScriptSerializer.Serialize () для создания JSON. Когда я устанавливаю точку останова и проверяю объект «data», он, похоже, имеет свойство d, которое содержит строку, которая должна быть JSON.

ДРУГОЕ РЕДАКТИРОВАНИЕ: Если я сделаю что-то подобное в моем успехе

$('#<%=Note.ClientID %>').val(data.d.[0]);

Я получаю {открывающую фигурную скобку. Я предполагаю, что получаю строку вместо JSON, но похоже, что это противоречит тому, что API jquery сообщает о возвращаемом значении, когда тип данных установлен в JSON.

Спасибо, ребята. Jim

Ответы [ 4 ]

2 голосов
/ 21 февраля 2010

Сначала убедитесь, что строка JSON существует в переменной "d" в ответе, возвращаемом в обратном вызове успеха. Далее, чтобы получить объект JSON, вам необходимо преобразовать строку в JSON. Вы можете использовать функцию eval или встроенную функцию JQuery для преобразования строки в JSON. Мне нравится плагин jquery-json для преобразования строки в представление JSON.

Ваш код будет выглядеть примерно так:

var jsonObject = eval('(' + data.d + ')'); 

Теперь вы можете использовать jsonObject.Note или любое другое свойство.

С плагином jquery-json вы можете делать следующее:

var note = $.evalJSON(data.d).Note;
1 голос
/ 21 февраля 2010

Вот как я обрабатываю. Обратите внимание на dataFilter: part - это заставляет его работать как с более новыми, так и с более старыми материалами asp.net.

$.ajax({ 
      type: "POST", 
     contentType: "application/json; charset=utf-8", 
       data: objectSaveData, 
       dataFilter: function(data) 
       { 
           var msg; 
           if (typeof (JSON) !== 'undefined' && 
              typeof (JSON.parse) === 'function') 
               msg = JSON.parse(data); 
           else 
               msg = eval('(' + data + ')'); 
           if (msg.hasOwnProperty('d')) 
                return msg.d; 
           else 
              return msg; 
        }, 
       url: "/mywebservice.asmx/myMethodName",  
       success: function(msg) 
       { 
          //do stuff 
       }, 
        failure: function(msg) 
       { 
          //handlefail 
       } 
  }); 
1 голос
/ 21 февраля 2010

Это так глупо ... извините, ребята. При возврате данных из asmx нет необходимости сериализовать их в JSON

У меня есть следующий класс, который я заполняю и возвращаю из моего веб-метода

public class VacationInfo
    {
        public string Note { get; set; }
        public List<DayInfo> dayInfo { get; set; }
        public VacationInfo(string note, List<DayInfo> dayinfo)
        {
            this.Note = note;
            this.dayInfo = dayinfo;
        }

        public class DayInfo
        {
            public string ShortDate { get; set; }
            public string DayType { get; set; }
            public string HalfDay { get; set; }
            public DayInfo(string shortdate, string daytype, string halfday)
            {
                this.ShortDate = shortdate;
                this.DayType = daytype;
                this.HalfDay = halfday;
            }
        }
    }

, пока ваш веб-сервис украшен

     [System.Web.Script.Services.ScriptService]

ваш объект будет бесплатно сериализован и возвращен как JSON. :)

тогда я могу сделать это

data.d.Note

в моем обратном звонке.

Спасибо за помощь, ребята.

Кредит, причитающийся кредит

1 голос
/ 21 февраля 2010

Это недопустимый формат JSON. Удалите двойные кавычки в начале и в конце, чтобы сделать его полноценным JSON.

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