Как проанализировать JSON, созданный объектом WCF DataContract

#javascript #jquery #.net #wcf

#javascript #jquery #.net #wcf

Вопрос:

У меня есть объект, украшенный атрибутом [DataContract], и моя служба WCF возвращает это как JSON, подобный этому:

 {"GetCommentsByPostResult":[{"CommentCreated":"/Date(1305736030505 0100)/","CommentText":"Comment 1"},{"CommentCreated":"/Date(1305736030505 0100)/","CommentText":"Comment 2"},{"CommentCreated":"/Date(1305736030505 0100)/","CommentText":"Comment 2"}]});
  

Я попытался выполнить итерацию по комментарию, созданному с помощью этого кода jQuery:

 $(data).each(function () 
{
     alert(this.CommentCreated);
});
  

Но все, что я получаю, это окно предупреждения с ‘undefined in’, поэтому я изменил его на:

  $(data).each(function () {

         $(this.GetCommentsByPostResult).each(function () {

                      alert(this.GetCommentsByPostResult);
         });

 });
  

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

Комментарии:

1. Что data в вашем примере javascript? Как вы вызываете эту службу? Покажите свой ajax-запрос.

Ответ №1:

Я не уверен, но я не думаю, что this это был бы текущий элемент при вызове each . Кроме того, почему вы обертываете data переменную функцией jQuery? Коллекции jQuery предназначены для элементов DOM.

 $.each(data.GetCommentsByPostResult, function (e) {
    alert(e.CommentCreated);
});
  

Комментарии:

1. 1; проблема в том, что вы не выполняли цикл data.GetCommentsPostResult . К вашему сведению, при $.each , this переменной присваивается значение объекта цикла, так что эта часть в порядке.

Ответ №2:

В зависимости от того, как вы получаете данные (библиотека? пользовательский код?) скорее всего, вам сначала придется преобразовать строку JSON в реальный объект JavaScript. Многие браузеры имеют встроенные методы для выполнения этого, хотя вам может потребоваться воспользоваться сторонней библиотекой, чтобы воспользоваться преимуществами тех, которые не имеют встроенной поддержки. Я бы рекомендовал JSON-js, поскольку он следует тому же синтаксису, что и встроенные в некоторые браузеры.

 var obj = JSON.parse(data);
  

Получив этот объект, вы теперь можете получить доступ к данным с помощью стандартных обозначений JavaScript в виде точек или скобок:

 var comments = obj.GetCommentsByPostResult; // or...
var comments = obj['GetCommentsByPostResult'];
  

Эти две строки эквивалентны. Чтобы повторить комментарии, как вы пытаетесь сделать, вы могли бы попробовать:

 $.each(obj.GetCommentsByPostResult, function (e) {
    alert(e.CommentCreated);
});
  

Кроме того, я бы рекомендовал использовать console.log() вместо alert() и браузер, который поддерживает проверку зарегистрированных объектов. Это может быть FireFox с расширением Firebug или Chrome с их инструментами разработчика (Ctrl-Shift-J для активации). Не уверен в статусе этого типа инструмента в IE9, хотя я бы не удивился, если бы там тоже был эквивалентный инструмент.