Как проанализировать Json, полученный через TCP / IP? - PullRequest
0 голосов
/ 24 января 2020

Я получил выходную строку с камеры, которая имеет формат по умолчанию: <Ticket><length>CR LF <Ticket><content>CR LF

Пример этого формата: <ticket=0010>L<length>CR LF<ticket=0010><unique message ID>:<JSON content>CR LF

Результат: 0010L000000045\r\n0010000500000:{"ID": 1034160761,"Index":1,"Name": "Pos 1"}\r\n

В общем, моя выходная строка содержит несколько предварительных объектов, а затем строку JSON. После того, как я запустил свою клиентскую часть и подключил ее к камере, которая работает на стороне сервера TCP / IP, я получил строку вывода камеры, которая была следующей: (0000L000000114 0000, 20) (24.380417; 13.144794; 62.600601; 51.364979; +0.491 ;; 59.664135; 77.126488; 97.884323; 115.346687; +0.464 ;;, 99) Здесь я всегда использовал, чтобы получить две строки, первая строка, по сравнению с форматом по умолчанию, имеет:

<Ticket><length>CR LF <Ticket> 

а вторая строка размером 99 байтов должна содержать JSON в соответствии с форматом по умолчанию. Во второй строке строка указывает координаты x, y и z двух разных областей интереса, которые я хочу получить в целочисленном формате, потому что координаты x и y имеют угол, и я хочу найти координаты центра. Итак, для моего приложения интерес представляет только 2-я строка, поэтому я использовал этот код для удаления первой строки:

if (readByCount > 30)
                {
                    var output = (new string(buff).TrimEnd('\u0000'), readByCount);
                    Debug.WriteLine(output);}

Так как первая строка имела размер менее 30 байт, она не отображалась. Я попытался разбить 2-ю строку сначала с помощью (;;), а затем с помощью (;) и сделать их целочисленным форматом, используя код:

 public async void ReadDataAsync(TcpClient mClient)
    {
        try
        {
            StreamReader clientStreamReader = new StreamReader(mClient.GetStream());

            char [] buff = new char[1024];
            int readByCount = 0;


            while (true)
            {
                readByCount = await clientStreamReader.ReadAsync(buff, 0, buff.Length);

                Directory.CreateDirectory("Camera o3D1");

                if (readByCount <= 0)
                {
                    Console.WriteLine("Disconnected from Server.");
                    mClient.Close();
                    break;
                }
                if (readByCount > 30)
                {
                    var output = new string(buff).TrimEnd('\u0000');
                    Debug.WriteLine(output);
                    var output1 = output.Split(new[] { ";;" }, StringSplitOptions.RemoveEmptyEntries).Select(s => s.Split(';')
                    .Select(i => int.Parse(i)).ToArray()).ToArray();
                    Console.WriteLine(output1);                    
                }

                Array.Clear(buff, 0, buff.Length);
            }


        }
        catch (Exception excp)
        {

            Console.WriteLine(excp.ToString());
        }
    }

Но я получаю сообщение об ошибке: входная строка не была в правильный формат.

Я попытался с помощью приведенного выше кода разбить нормальную строку, например строку text = "3; 4; 5; 6; 7 ;; 3; 4; 5; 6; 7 ;; 3; 4; 5; 6; 7 ;; 3; 4; 5; 6; 7 ;; 3; 4; 5; 6; 7 ;; "; и мне это удалось, но он не работает с JSON контентом. Я считаю, что метод, который работает с обычной строкой, не будет работать с содержимым JSON. Что мне нужно сделать, чтобы разделить каждый компонент JSON и изменить тип данных на целое, чтобы я мог выполнить некоторые математические операции с ним?

1 Ответ

0 голосов
/ 24 января 2020

«Входная строка была не в правильном формате» - это ошибка, сгенерированная «int.Parse (i)», когда входная строка не может быть проанализирована как допустимое целое число

Вы анализируете каждую строку, возвращаемую Трещина. Одна из этих строк - «0000L000000114», которая не может быть преобразована в целое число, поэтому ваша ошибка.

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