Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
2 / 1 / 1
Регистрация: 04.08.2015
Сообщений: 126

Как десериализовать json-строку в обьект?

28.11.2016, 15:26. Показов 1447. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть клиент и сервер. Они общаються друг с другом через UDP протокол 50 раз в секунду. Сервер собирает на своей стороне обьект Dictionary<string,Dictionary<string,stri ng>>, сериализует его в Json, затем переводит в байты и отправляет это клиенту. Для сериализации-десериализации я использую библиотеку Newtonsoft.Json.
Вот примерный код:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
Dictionary<string, Dictionary<string, string>> dicSend = new Dictionary<string, Dictionary<string, string>>();
                                foreach (Player p in playerList)
                                {
                                    Dictionary<string, string> dicP = new Dictionary<string, string>();
                                    dicP.Add("id", p.identificator.ToString());
                                    dicP.Add("x", p.X.ToString());
                                    dicP.Add("y", p.Y.ToString());
                                    dicP.Add("wx", p.way.X.ToString());
                                    dicP.Add("wy", p.way.Y.ToString());
 
                                    dicSend.Add(p.identificator.ToString(), dicP);
                                }
byte[] bytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(dicSend))
Клиент получает это и десериализует обратно из байтов в json и потом в обьект Dictionary<string, Dictionary<string, string>>.
Вот примерный код:
C#
1
2
Dictionary<string, Dictionary<string, string>> dic = new Dictionary<string, Dictionary<string, string>>();
                dic = JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, string>>>(Encoding.UTF8.GetString(bytesFromServer));
И вот тут, на строчке десериализации из байтов в dic вылетает исключение - "additional text encountered after finished reading json content..."и дальше какие-то строчки, номера, которые мне ничего не говорят=( Гуглил, пишут ерунду мистическую, мол там где-то невидимые знаки, которых при дебаге не видно, а они в конец дописываются и портят всю малину при десериализации...Помогите разобратся в этом хоть немного! Заранее благодарен!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.11.2016, 15:26
Ответы с готовыми решениями:

Подскажите как десериализовать JSON строку в объекты?
{ &quot;животные&quot;:{ &quot;кошка&quot;:{ &quot;вес&quot;:5, &quot;передвижение&quot;:&quot;бежать&quot; },&quot;лошадь&quot;:{ &quot;вес&quot;:150, &quot;передвижение&quot;:&quot;скакать&quot; ...

[JSON.NET] Как десериализовать Json с меняющимеся ключами?
Имеется структура Json ответа вида: { field1: { &quot;2187d248-1a3b-35d0-a4ec-bead586ff547&quot; : { childField1:...

Как десериализовать такой JSON
Уважаемые форумчане. Имеется вот такой JSON: { &quot;BTC_EUR&quot; : { &quot;avg&quot; : &quot;372.93547004&quot;, &quot;buy_price&quot; : &quot;372&quot;, ...

6
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,898
Записей в блоге: 1
28.11.2016, 16:24
Роман Гайдук, скорее всего проблема в "мусоре" в конце текста который образуется из-за того что ты преобразуешь в строку весь буфер, а не только полученные данные.
0
2 / 1 / 1
Регистрация: 04.08.2015
Сообщений: 126
28.11.2016, 17:34  [ТС]
Тоесть на стороне клиента я пытаюсь десериализовать весь буфер целиком? А как тогда выбрать только полученные данные, чтоб без "мусора"?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,898
Записей в блоге: 1
28.11.2016, 18:05
Роман Гайдук, при получении данных тебе сообщается сколько именно байтов было записано в буфер. Только их и нужно брать. У метода Encoding.GetString() есть перегрузка для этого случая. Это способ подойдет только в случае когда все данные получены одним пакетом. В случае когда данные могут прийти в нескольких пакетах нужно декодировать текст с помощью класса Decoder который умеет обрабатывать случаи с неполностью полученными данными.
0
2 / 1 / 1
Регистрация: 04.08.2015
Сообщений: 126
29.11.2016, 12:56  [ТС]
Спасибо) Попробовал решение с перегрузкой Encoding - проблема почти исчезла, но все равно регулярно появляется ошибка, значит некоторые дейтаграммы приходят разными пакетами. А вот с классом Decoder что-то не заладилось - никак не пойму как правильно считать разные пакеты в один буфер и чтоб не перепутать их с пакетами других дейтаграмм. Не мог бы ты подсказать как правильно использовать класс в моем случае?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,898
Записей в блоге: 1
29.11.2016, 13:14
Роман Гайдук, протокол udp не гарантирует доставку и соблюдение очередности. Если в рамках твоей задачи важен порядок пакетов, то нужно писать свою реализацию очередности (например нумеровать пакеты) или использовать другой протокол.
0
2 / 1 / 1
Регистрация: 04.08.2015
Сообщений: 126
29.11.2016, 13:24  [ТС]
Для моей программы допускается процент потерянных пакетов. Просто когда функция которая разбирает ответ сервера пытается десериализовать его, а там не хватает половины данных, или наоборот, есть мусор, то возникает ошибка. Возможно стоит игнорировать такие невалидные дейтаграммы и обходится только теми, которые пришли 1 пакетом. Попробую пока так.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.11.2016, 13:24
Помогаю со студенческими работами здесь

Как правильно десериализовать JSON?
Подскажите, что я делаю не так? using System; using System.Collections.Generic; using System.Linq; using System.Text; using...

Как десериализовать JSON если имя объекта все время меняется ?
{ &quot;success&quot;: true, &quot;rgInventory&quot;: { &quot;14686634559&quot;: { &quot;id&quot;: &quot;14686634559&quot;, &quot;classid&quot;: &quot;2942712096&quot;, ...

Десериализовать JSON
Добрый вечер. Подскажите как правильно создать класс для десериализации вот такого jsona.

Десериализовать JSON из массива
Прошу помощи, подскажите как десериализовать вот такую строку ,,].

Не могу десериализовать json
Всем привет. Получаю от сервера ответ в формате json: Пытаюсь десериализовать его так: public class RootObject { public Task...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru