0

В командную строку выходит JSON ответ в переменной responce. Почему у меня не парсится определенная строка из responce

            StringBuilder response = new StringBuilder();
            NetworkStream stream = client.GetStream();
            stream.Write(packet, 0, packet.Length);
            stream.Flush();
            do
            {
                int bytes = stream.Read(data, 0, data.Length);
                response.Append(Encoding.UTF8.GetString(data, 0, bytes));
            }
            while (stream.DataAvailable); // пока данные есть в потоке

            // Закрываем потоки
            stream.Close();
            client.Close();
            Console.WriteLine(response.ToString());

            var m = JsonConvert.DeserializeObject<string>(response);

            string name = m.Key;
Sasha34
  • 97
  • у вас не парсится какая то строка, но вы её не показываете – tym32167 Oct 23 '19 at 10:34
  • и я не понял, зачем вы пытаетесь строку десериализовать в строку? – tym32167 Oct 23 '19 at 10:35
  • У меня строка response выводит на экран json строку. В ней есть поле "key":"long_example", как мне пропарсить ее чтобы записать в name "long_example" ? – Sasha34 Oct 23 '19 at 10:53
  • Бред какой-то... Пишете в stream какие-то данные и тут же из него читаете. Эти же данные хотите прочитать? / Flush() сбрасывает буфер, но не перематывает поток в начало. – Alexander Petrov Oct 23 '19 at 10:53
  • Предлагаю упростить вопрос. Уберите код работы с потоком. Я так понял, вы же успешно получаете данные из него? Покажите только имеющуюся строку с данными JSON и укажите, что хотите в итоге получить. – Alexander Petrov Oct 23 '19 at 10:56
  • Так вычитывать utf-8 нельзя. В нем символ может занимать несколько байт, и на итерации может попасть на середину символа. И точно нельзя читать из сокета по признаку DataAvailable - это флаг означает, что данные дошли в буфер сокета. А не "удаленный хост больше ничего не отправил". Хост может отправить, но данные не успеют дойти - и ваш код оборвет соединение. Причем это обязательно выстрелит вживую при работе по сети, но никогда не выстрелит на локальной машине. Правильно - накапливать весь ответ в буфер как байты (MemoryStream), и переставать читать тогда, когда Read вернет 0. –  Oct 23 '19 at 10:56
  • ZBXD☺[ {"response":"success","data":[{"key":"long_example","delay":30,"las_tlogsize":0,"mtime":0}]} Запрос завершен... Приходит вот это. Мне нужно в переменную Key записать long_example – Sasha34 Oct 23 '19 at 11:01

0 Answers0