Десериализовать строку Json из действия MVC в класс C # - PullRequest
2 голосов
/ 20 августа 2011

У меня есть вызов Ajax (для диаграммы HighChartsDB) в приложении WebForm, которое вызывает веб-сервис, который использует WebRequest для вызова действия MVC в другом приложении, которое возвращает JsonResult.

Мне удается передать данные обратно в вызов ajax, но возвращаемые данные не анализируются как объект json, а просто как строка.

Мой класс:

public class CategoryDataViewModel
{
    public string name { get; set; }
    public List<int> data { get; set; }
    public double pointStart { get; set; }
    public int pointInterval { get { return 86400000; } }
}

Моя функция ajax, вызываемая старшими диаграммами:

function getBugs(mileId) {
    var results;

    $.ajax({
        type: 'GET',
        url: 'Services/WebService.svc/GetData',
        contentType: "application/json; charset=utf-8",
        async: false,
        data: { "mileId": parseInt(mileId) },
        dataType: "json",
        success: function (data) {
            console.log(data);
            results = data;
        }
    });

    return results;
}

И, наконец, мой веб-сервис

public class WebService : IWebService
{
    public string GetData(int mileId)
    {
        string url = "http://localhost:63418/Home/GetWoWData?mileId=" + mileId;
        WebRequest wr = WebRequest.Create(url);

        using (var response= (HttpWebResponse)wr.GetResponse())
        {
            using (var reader = new StreamReader(response.GetResponseStream()))
            {
                var objText = reader.ReadToEnd();
                return objText;
            }
        }

    }
}

С этим, когда я console.log (data) на вызов ajax, я получаю:

[{\"name\":\"Sedan\",\"data\":[30,30,30,30,35],\"pointStart\":1307836800000,\"pointInterval\":86400000},{\"name\":\"Low\",\"data\":[800,800,800,826,1694],\"pointStart\":1307836800000,\"pointInterval\":86400000},{\"name\":\"Medium\",\"data\":[180,180,180,186,317],\"pointStart\":1307836800000,\"pointInterval\":86400000},{\"name\":\"High\",\"data\":[29,29,29,34,73],\"pointStart\":1307836800000,\"pointInterval\":86400000},{\"name\":\"Truck\",\"data\":[6,6,6,6,13],\"pointStart\":1307836800000,\"pointInterval\":86400000},{\"name\":\"SUV\",\"data\":[-172,-172,-172,-179,-239],\"pointStart\":1307836800000,\"pointInterval\":86400000},{\"name\":\"Convertible\",\"data\":[0,0,0,0,-404],\"pointStart\":1307836800000,\"pointInterval\":86400000},{\"name\":\"Limo\",\"data\":[-7,-7,-7,-8,-214],\"pointStart\":1307836800000,\"pointInterval\":86400000}]

Кажется, мне не удается вернуться обратно в нужный объект Json. Я попытался преобразовать его обратно в мою CategoryDataViewModel с этим в моем веб-сервисе:

    var myojb = new CategoryDataViewModel ();
    using (var response = (HttpWebResponse)wr.GetResponse())
    {
        using (var reader = new StreamReader(response .GetResponseStream()))
        {
            JavaScriptSerializer js = new JavaScriptSerializer();
            var objText = reader.ReadToEnd();
            myojb = (CategoryDataViewModel )js.Deserialize(objText, typeof(CategoryDataViewModel ));
        }
    }

    return myojb;

Но тогда я получаю Type 'Test.CategoryDataViewModel' is not supported for deserialization of an array.

Ответы [ 2 ]

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

Я видел подобное раньше, думаю, вам может понадобиться изменить myObj в список.

List<CategoryDataViewModel> myObjs = new List<CategoryDataViewModel>();
...
myObjs = js.Deserialize<List<CategoryDataViewModel>>(objText);
1 голос
/ 20 августа 2011

Изменение:

myojb = (CategoryDataViewModel )js.Deserialize(objText, typeof(CategoryDataViewModel ));

до:

myojb = (List<CategoryDataViewModel> )js.Deserialize(objText, typeof(List<CategoryDataViewModel>));

и у тебя все будет хорошо. Массив будет десериализован в список без проблем.

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