Как читать пакеты JSON для конкретного ключевого слова в C? - PullRequest
0 голосов
/ 16 мая 2019

Это мой пакет json, и я хочу прочитать "14.469121":

{"jsonrpc": "2.0", "method": "notifySpeed", "params": {"speed": "14.469121"}}

Я попробовал некоторые онлайн-решения и реализовал некоторую логику.

ptr = strtok(parse_recData,", ");

     while(ptr != NULL)
     {
         countTillMethod--;
         if(countTillMethod == 0)
         {
             if(strcmp(ptr,"\"notifySpeed\"")==0)
             {
              if(!(strcmp(ptr,"\"Speed\"" )))

                Speed = strtok(NULL,", ");

                 SpeedValue = atoi (Speed);

                 if (SpeedValue > PERMISSIBLE_LIMIT)
                            touchControl (DISABLE);
                 else
                            touchControl (ENABLE);
            }
         }
     }

Я хочу прочитать данные о скорости.

Ответы [ 3 ]

1 голос
/ 17 мая 2019

Спасибо всем, помогите, наконец, я успешно внедряю.

         else if(strcmp(ptr,"\"notifySpeed\"")==0)
         {
             syslog(LOG_INFO,"Received Speed\n");
             ptr1 = strstr(parse_recData_backup, "\"params\"");
             ptr1 += strlen("params");
             ptr1 = strstr(parse_recData_backup, "\"speed\": ");
             ptr1 += strlen("\"speed\": ") + 1;

             /* get the exect value */
             for(i=0; ptr[i]!='\0'; ++i)
             {
             while (!((ptr1[i]>='0'&&ptr1[i]<='9') || (ptr1[i] == '.') || (ptr1[i] == '\0')))
             {
                    for(j=i;ptr1[j]!='\0';++j)
                    {
                    ptr1[j]=ptr1[j+1];
                    }
                    ptr1[j]='\0';
             }
             }
             syslog(LOG_INFO," %s \r\n", ptr1);

             /* Converts the string to integer */
             Speed = atoi(ptr1);
             syslog(LOG_INFO," speed is %d \r\n", Speed);

             /* Compare the speed with permissiable limit */
             if (Speed > PERMISSIBLE_LIMIT)
                        touchControl (DISABLE);
             else
                        touchControl (ENABLE);

         }
0 голосов
/ 20 мая 2019
char  parse_recData[215] = {"jsonrpc": "2.0", "method": "notifySpeed", "params": {"speed": "14.469121"}};
char  parse_recData_backup[215];
char *ptr1 = NULL;
int Speed = 0;

strcpy(parse_recData_backup, parse_recData);

ptr = strtok(parse_recData,", ");

    while(ptr != NULL)
    {
        countTillMethod--;
        if(countTillMethod == 0)
        {
            if(strcmp(ptr,"\"notifySpeed\"")==0)
            {
                syslog(LOG_INFO,"Received Speed\n");
                ptr1 = strstr(parse_recData_backup, "\"speed\": ");
                ptr1 += strlen("\"speed\": ") + 1;

                /* Converts the string to integer */
                Speed = atoi(ptr1);
                syslog(LOG_INFO," speed is %d \r\n", Speed);

                /* Compare the speed with permissiable limit */
                if (Speed > PERMISSIBLE_LIMIT)
                    touchControl (DISABLE);
                else
                    touchControl (ENABLE);

         }
        }
        ptr = strtok(NULL, ",");
    }
0 голосов
/ 16 мая 2019

strchr можно использовать для поиска {, затем sscanf для получения скорости.

#include <stdio.h>
#include <string.h>

int main( void) {
    char text[] = "{\"jsonrpc\": \"2.0\", \"method\": \"notifySpeed\", \"params\": {\"speed\": \"14.469121\"}}";
    char *ptr = text;
    int scanned = 0;
    double SpeedValue = 0;

    while ( ( ptr = strchr ( ptr, '{'))) {
        if ( 1 == ( scanned = sscanf ( ptr, "{ \"speed\" : \"%lf", &SpeedValue))) {
            break;
        }
        ptr++;
    }
    if ( 1 == scanned) {
        printf ( "speed value is %f\n", SpeedValue);
    }

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