Десериализация данных 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)