Как прочитать ответ JSON, содержащий массив объектов пользовательского класса?

0

Я разрабатываю веб-сайт ASP.NET WebForms, который использует JQuery для извлечения некоторых данных из обработчика ASHX ASP.NET. Эти данные представляют собой массив объектов класса, который определяется пользователем. Ниже приведен код обработчика:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Script.Serialization;
using WRG_2._1.WRGCore;

namespace WRG_2._1.Handlers
{
    /// <summary>
    /// Summary description for ResponseFetcher
    /// </summary>
    public class ResponseFetcher : IHttpHandler, System.Web.SessionState.IReadOnlySessionState
    {
        public void ProcessRequest(HttpContext context)
        {
            List<Topic> comments = new List<Topic>() {
                new Topic(){ Title=DateTime.Now.ToString() +":"+ DateTime.Now.Millisecond },
                new Topic(){ Title=DateTime.Now.ToString() +":"+ DateTime.Now.Millisecond },
                new Topic(){ Title=DateTime.Now.ToString() +":"+ DateTime.Now.Millisecond },
                new Topic(){ Title=DateTime.Now.ToString() +":"+ DateTime.Now.Millisecond },
                new Topic(){ Title=DateTime.Now.ToString() +":"+ DateTime.Now.Millisecond },
                new Topic(){ Title=DateTime.Now.ToString() +":"+ DateTime.Now.Millisecond },
                new Topic(){ Title=DateTime.Now.ToString() +":"+ DateTime.Now.Millisecond },
                new Topic(){ Title=DateTime.Now.ToString() +":"+ DateTime.Now.Millisecond },
                new Topic(){ Title=DateTime.Now.ToString() +":"+ DateTime.Now.Millisecond },

            };
            JavaScriptSerializer jss = new JavaScriptSerializer();
            string sJSON = jss.Serialize(comments);
            context.Response.Write(sJSON);
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }

    }
}

Я извлекаю данные из JQuery Ajax следующим образом:

$(document).ready(function () {
            var url = '/Handlers/ResponseFetcher.ashx';
            $.ajax({
                url: url,
                type: "POST",
                data:
                    JSON.stringify({ val1: 2, val2: 3 })
                ,
                dataType: "json",
                cache: true,
                beforeSend: function () {
                    now = (new Date()).getTime();
                    if (localCache.exist(url)) {
                        tDiff = now - cacheTime;
                        if (tDiff < 20000) {
                            loadData(localCache.get(url));
                            return false;
                        }
                    }
                    return true;
                },
                complete: function (jqXHR, textStatus) {
                    localCache.set(url, jqXHR, loadData);
                }
            });

        });

        function loadData(data) {
            console.log(data);
            $(data.responseJSON).each(function (i) {

                $('#responsecontainer').html = data.responseJSON[i].Title;
            });
        }

Функция loadData() получает данные отлично. Но это не добавление его в #responsecontainer div. Пожалуйста помоги!

Обратите внимание, что класс Topic может иметь нулевые переменные.

3 ответа

0
Лучший ответ

Проблема заключалась в разборе JSON-ответа. Я преобразовал свой код функции loadData() в:

function loadData(data) {
            var resdata = JSON.parse(data.responseText);
            console.log(resdata[0].Title);

            $(resdata).each(function (i) {
                $('#responsecontainer').append(resdata[i].Title);
            });
        } 

И теперь его работа. Спасибо всем, кто ответил на мой вопрос. Ваши ответы дали мне этот намек. :)

  • 1
    Внутри обратного вызова .each текущий элемент массива будет присвоен 'this', поэтому альтернативный способ достижения того же результата: $ ('# responsecontainer'). Append (this.Title);
  • 0
    @ 76484 спасибо за предложение :)
1

jQuery.html - это метод. Вы используете его как сеттер, передавая новое значение в качестве аргумента:

$('#responsecontainer').html(data.responseJSON[i].Title);

Но это будет итеративно заполнять #responsecontainer каждым.Title в ваших объектах data.reponseJSON, причем каждый.Title заменяет последний.Title, поэтому вы будете видеть только последний.Title. Вероятно, вы хотите добавить:

$('#responsecontainer').append(data.responseJSON[i].Title);
1

Возвращая его таким образом, у вас действительно есть свойство responseJSON на объекте данных?

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

$(data).each(function (i) {
    $('#responsecontainer').append(data[i].Title);
});

Ещё вопросы

Сообщество Overcoder
Наверх
Меню