Member 14075735 Ответов: 0

Десериализация данных json из webservice


глобально у меня есть следующий объект:

public class Geraet
    {
        public long Geraetenr { get; set; }
        public int Typ { get; set; }
        public string Platz { get; set; }
        public string Bezeichnung { get; set; }
        public int Tr { get; set; }
        public string Ip { get; set; }
        public string Bespielt { get; set; }
    }


Я заполняю список этих объектов, сериализую их и отправляю через веб-сервис:

[HttpGet]
public IHttpActionResult Get_Feedback()
{
        List<Geraet> geraeteliste = null;

        try
        {
            geraeteliste = GetSpielgeraeteFromDatabase();
        }
        catch (Exception e)
        {
            Debug.WriteLine(e.Message);
        }
        if (geraeteliste == null)
        {
            return Ok("No record found!");
        }
        else
        {
            var json = Newtonsoft.Json.JsonConvert.SerializeObject(geraeteliste);
            return Json(json);
        }
}


Данные, полученные веб-сервисом, выглядят следующим образом:

"[{\"Geraetenr\":123456789,\"Typ\":61,\"Platz\":\"1-01\",\"Bezeichnung\":\"CSII ADM430\",\"Tr\":3,\"Ip\":\"123.123.123.123\",\"Bespielt\":\"0\"},{\"Geraetenr\":987654321,\"Typ\":61,\"Platz\":\"2-12\",\"Bezeichnung\":\"M-BOX PUR+ GOLD\",\"Tr\":3,\"Ip\":\"124.124.124.124\",\"Bespielt\":\"0\"}]"


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

private List<Geraet> GetSpielgeraeteFromWebservice()
{
    List<Geraet> geraeteliste;

    var request = HttpWebRequest.Create(Constants.GeraetelistServicePath);
    request.ContentType = "application/json";
    request.Method = "GET";

    using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
    {
        using (StreamReader reader = new StreamReader(response.GetResponseStream()))
        {
            var json = reader.ReadToEnd();

            geraeteliste = JsonConvert.DeserializeObject<List<Geraet>>(json);             
        }
    }
    return geraeteliste;
}


К сожалению, я получаю ошибку времени выполнения в строке geraeteliste = JsonConvert.DeserializeObject<List<geraet>>(json); говоря:

Unhandled Exception:
Newtonsoft.Json.JsonSerializationException: Error converting value "[{"Geraetenr":123456789,"Typ":61,"Platz":"1-01","Bezeichnung":"CSII ADM430","Tr":3,"Ip":"123.123.123.123","Bespielt":"0"},{"Geraetenr":987654321,"Typ":61,"Platz":"2-12","Bezeichnung":"M-BOX PUR+ GOLD","Tr":3,"Ip":"124.124.124.124","Bespielt":"0"}]" to type 'System.Collections.Generic.List`1[GroceryList.Classes.Geraet]'. Path '', line 1, position 3421.


Отправка / извлечение материала действительно работает, иначе сообщение об ошибке было бы в строке var json = reader.ReadToEnd(); или я бы не получил правильные значения в сообщении об ошибке. Так что что - то с десериализацией не получается.
Может ли кто-нибудь помочь и сказать мне, в чем заключается или может быть проблема? Почему он не может обратиться? Это правильный порядок и правильные ценности?

С уважением

Что я уже пробовал:

Различные модификации объекта

0x01AA

подозрительно: строка 1, положение 3421

Member 14075735

извини, что не понял... что ты пытался мне сказать? xD что подразумевается под позицией 3421? :X

0x01AA

Полученные данные имеют длину около 247 символов, а ошибка находится в позиции 3421...

Member 14075735

Так что же, полученные данные слишком длинные? Это и есть ошибка?

0x01AA

Нет, полученные данные не слишком длинны. Вам нужно использовать отладчик для проверки полученных данных в позиции 3421 (если ответ действительно такой длинный). Согласно сообщению execption, ваши полученные данные имеют длину 247 символов, но ошибка находится в позиции 3421, что является противоречием

F-ES Sitecore

Используйте отладчик, чтобы проверить, что находится в переменной "json", и посмотреть, проливает ли это свет на то, почему она не работает.

Member 14075735

Полные данные, полученные от веб-сервиса, следующие:

"[{\"Geraetenr\":301503721,\"Typ\":61,\"Platz\":\"1-01\",\"Bezeichnung\":\"CSII ADM430\",\"Tr\":3,\"Ip\":\"ipplaceholder\",\"Bespielt\":\"0\"},{\"Geraetenr\":301510681,\"Typ\":61,\"Platz\":\"1-02\",\"Bezeichnung\":\"CSII ADM430\",\"Tr\":3,\"Ip\":\"ipplaceholder\",\"Bespielt\":\"0\"},{\"Geraetenr\":301314390,\"Typ\":61,\"Platz\":\"1-03\",\"Bezeichnung\":\"LS ADM1500\",\"Tr\":3,\"Ip\":\"ipplaceholder\",\"Bespielt\":\"0\"},{\"Geraetenr\":299614347,\"Typ\":61,\"Platz\":\"1-04\",\"Bezeichnung\":\"M-BOX PUR RED+\",\"Tr\":3,\"Ip\":\"172.16.11.106\",\"Bespielt\":\"0\"},{\"Geraetenr\":239302462,\"Typ\":61,\"Platz\":\"1-05\",\"Bezeichnung\":\"NSTAR DL XI\",\"Tr\":3,\"Ip\":\"ipplaceholder\",\"Bespielt\":\"0\"},{\"Geraetenr\":301503720,\"Typ\":61,\"Platz\":\"1-06\",\"Bezeichnung\":\"CSII ADM430\",\"Tr\":3,\"Ip\":\"ipplaceholder\",\"Bespielt\":\"0\"},{\"Geraetenr\":299624167,\"Typ\":61,\"Platz\":\"1-07\",\"Bezeichnung\":\"M-BOX PUR+ GOLD\",\"Tr\":3,\"Ip\":\"ipplaceholder\",\"Bespielt\":\"0\"},{\"Geraetenr\":277514956,\"Typ\":61,\"Platz\":\"1-08\",\"Bezeichnung\":\"AC SLANT II\",\"Tr\":3,\"Ip\":\"ipplaceholder\",\"Bespielt\":\"0\"},{\"Geraetenr\":293111490,\"Typ\":61,\"Platz\":\"1-09\",\"Bezeichnung\":\"LStar_2 ADM515\",\"Tr\":3,\"Ip\":\"ipplaceholder\",\"Bespielt\":\"0\"},{\"Geraetenr\":299619324,\"Typ\":61,\"Platz\":\"1-10\",\"Bezeichnung\":\"M-BOX PUR+ PLA\",\"Tr\":3,\"Ip\":\"ipplaceholder\",\"Bespielt\":\"0\"},{\"Geraetenr\":293111480,\"Typ\":61,\"Platz\":\"1-11\",\"Bezeichnung\":\"LStar_2 ADM515\",\"Tr\":3,\"Ip\":\"ipplaceholder\",\"Bespielt\":\"0\"},{\"Geraetenr\":301306613,\"Typ\":61,\"Platz\":\"1-12\",\"Bezeichnung\":\"LS ADM1500\",\"Tr\":3,\"Ip\":\"ipplaceholder\",\"Bespielt\":\"0\"},{\"Geraetenr\":277512955,\"Typ\":61,\"Platz\":\"2-01\",\"Bezeichnung\":\"AC SLANT II\",\"Tr\":3,\"Ip\":\"ipplaceholder\",\"Bespielt\":\"0\"},{\"Geraetenr\":277512957,\"Typ\":61,\"Platz\":\"2-02\",\"Bezeichnung\":\"AC SLANT II\",\"Tr\":3,\"Ip\":\"ipplaceholder\",\"Bespielt\":\"0\"},{\"Geraetenr\":301511346,\"Typ\":61,\"Platz\":\"2-03\",\"Bezeichnung\":\"CSII ADM430\",\"Tr\":3,\"Ip\":\"ipplaceholder\",\"Bespielt\":\"0\"},{\"Geraetenr\":299618685,\"Typ\":61,\"Platz\":\"2-04\",\"Bezeichnung\":\"M-BOX PUR+ PLA\",\"Tr\":3,\"Ip\":\"ipplaceholder\",\"Bespielt\":\"0\"},{\"Geraetenr\":277804090,\"Typ\":61,\"Platz\":\"2-05\",\"Bezeichnung\":\"NSuperstar2_638\",\"Tr\":3,\"Ip\":\"172.16.11.144\",\"Bespielt\":\"0\"},{\"Geraetenr\":301511345,\"Typ\":61,\"Platz\":\"2-06\",\"Bezeichnung\":\"CSII ADM430\",\"Tr\":3,\"Ip\":\"ipplaceholder\",\"Bespielt\":\"0\"},{\"Geraetenr\":2975141641,\"Typ\":61,\"Platz\":\"2-07\",\"Bezeichnung\":\"M.SEV MTG P. HD\",\"Tr\":3,\"Ip\":\"ipplaceholder\",\"Bespielt\":\"0\"},{\"Geraetenr\":2975141642,\"Typ\":61,\"Platz\":\"2-08\",\"Bezeichnung\":\"M.SEV MTG P. HD\",\"Tr\":3,\"Ip\":\"ipplaceholder\",\"Bespielt\":\"0\"},{\"Geraetenr\":277514955,\"Typ\":61,\"Platz\":\"2-09\",\"Bezeichnung\":\"AC SLANT II\",\"Tr\":3,\"Ip\":\"ipplaceholder\",\"Bespielt\":\"0\"},{\"Geraetenr\":301306528,\"Typ\":61,\"Platz\":\"2-10\",\"Bezeichnung\":\"LS ADM1500\",\"Tr\":3,\"Ip\":\"ipplaceholder\",\"Bespielt\":\"0\"},{\"Geraetenr\":301503433,\"Typ\":61,\"Platz\":\"2-11\",\"Bezeichnung\":\"CSII ADM430\",\"Tr\":3,\"Ip\":\"ipplaceholder\",\"Bespielt\":\"0\"},{\"Geraetenr\":299624164,\"Typ\":61,\"Platz\":\"2-12\",\"Bezeichnung\":\"M-BOX PUR+ GOLD\",\"Tr\":3,\"Ip\":\"ipplaceholder\",\"Bespielt\":\"0\"}]"

0x01AA

Оба полных ответа, которые вы опубликовали (это я удалил первый), похоже, хорошо отформатированы при проверке их с помощью JSON Formatter & валидатор[^]

Вы можете использовать отладчик и проверить, что происходит в позиции 3421, которая находится вне длины вашего опубликованного json, которая составляет 2891 символ...

Лично я бы сначала ограничил ответ чем - то вроде 10 объектов:
а) он не работает с ограниченным числом объектов
Основная проблема должна быть решена.
б) он работает с ограниченным количеством объектов
Увеличивайте количество возвращаемых объектов до тех пор, пока это не приведет к сбою. Найдите компонент который выходит из строя и найдите причину почему

Richard Deeming

Этот JSON, с определением класса из вашего вопроса, десериализуется идеально для меня, используя:

JsonConvert.DeserializeObject<List<Geraet>>(json)

0 Ответов