用C语言提取字符串

时间:2016-12-23 07:21:15

标签: c json

在JSMN库实现之下。它在传入的JSON消息中搜索“command”,“rf_type”和“Filter”的位置。现在程序自动打印提取的字符串。我需要将它传递给另一个变量并在另一个函数中使用该字符串。

start->从JSON提取命令 - >传递给另一个函数 - >结束

在这种情况下,任何人都可以指导如何将字符串打印到变量

 printf("===============================\n");
 for (i = 1; i < r; i++) {

        if (jsoneq(JSON_STRING, &t[i], "command") == 0) 
        {

        printf("- command: %.*s\n", t[i+1].end-t[i+1].start,
                JSON_STRING + t[i+1].start);
        i++;
        } 

        else if (jsoneq(JSON_STRING, &t[i], "rf_type") == 0) 

        {

        printf("- rf_type: %.*s\n", t[i+1].end-t[i+1].start,
                JSON_STRING + t[i+1].start);
        i++;
        }
        else if (jsoneq(JSON_STRING, &t[i], "filter") == 0) 

        {

        printf("- filter: %.*s\n", t[i+1].end-t[i+1].start,
                JSON_STRING + t[i+1].start);
        i++;
        }

        else 
        {
        printf("Unexpected messages HUB_HCI: %.*s\n", t[i].end-t[i].start,
                JSON_STRING + t[i].start);
        }
}
return 1;

3 个答案:

答案 0 :(得分:1)

这是用于接收消息和比较的全功能实现。

int msgarrvd(void *context, char *topicName, int topicLen,MQTTClient_message *message)
{
 int i;
char* payloadptr;
char *test[256];
printf("Message arrived\n");
printf("topic: %s\n", topicName);
printf("===============================\n");

payloadptr = message->payload;
for(i=0; i<message->payloadlen; i++)
{
    JSON_STRING[i]=*payloadptr++;
    //putchar(*payloadptr++);
printf("%c", JSON_STRING[i]);
}
putchar('\n');
MQTTClient_freeMessage(&message);
MQTTClient_free(topicName);

    jsmn_init(&p);
r = jsmn_parse(&p, JSON_STRING, strlen(JSON_STRING), t, sizeof(t)/sizeof(t[0]));
if (r < 0) {
    printf("Failed to parse JSON: %d\n", r);
}


if (r < 1 || t[0].type != JSMN_OBJECT) {
    printf("Not Valid JSON-HCI_HUB\n");
}

printf("===============================\n");
for (i = 1; i < r; i++) {

        if (jsoneq(JSON_STRING, &t[i], "command") == 0) 
        {

        printf("- command: %.*s\n", t[i+1].end-t[i+1].start,
                JSON_STRING + t[i+1].start);
        test[256]=t[i+1].end-t[i+1].start,JSON_STRING + t[i+1].start;
        printf("%s\n",&test);
        i++;
        } 

        else if (jsoneq(JSON_STRING, &t[i], "rf_type") == 0) 

        {

        printf("- rf_type: %.*s\n", t[i+1].end-t[i+1].start,
                JSON_STRING + t[i+1].start);
        i++;
        }
        else if (jsoneq(JSON_STRING, &t[i], "filter") == 0) 

        {

        printf("- filter: %.*s\n", t[i+1].end-t[i+1].start,
                JSON_STRING + t[i+1].start);
        i++;
        }

        else 
        {
        printf("Unexpected messages HUB_HCI: %.*s\n", t[i].end-t[i].start,
                JSON_STRING + t[i].start);
        }
}
return 1;
}

答案 1 :(得分:0)

    else 
    {
    printf("Unexpected messages HUB_HCI: %.*s\n", t[i].end-t[i].start,
            JSON_STRING + t[i].start);
    }

对我来说非常可疑 我希望

    else 
    {
    printf("Unexpected messages HUB_HCI: %.*s\n", t[i].end-t[i].start,
            (const char *) t[i].start);
    }

为什么要将JSON_STRING枚举类型常量添加到指针?

答案 2 :(得分:0)

考虑使用tiny-json。它不仅是一个标记器。您可以以字符串格式获取数据,或者在C类型变量中获取原语值而不会丢失性能。

您可以通过两种方式使用。您可以一对一地获取JSON字段。

    char str[] = "{\"command\":\"qwerty\",\"rf_type\":2,\"filter\":\"low pass\",\"unexpected\":\"hello\"}";       
    puts( str );

    json_t pool[5];
    json_t const* root = json_create( str, pool, 5 );

    if ( root ) {

        json_t const* field = json_getChild( root );
        while( field ) {                
                char const* name  = json_getName( field );
                char const* value = json_getValue( field );

                if ( !strcmp( name, "command") )
                    printf("- command: %s\n", value );

                else if ( !strcmp( name, "rf_type") )
                    printf("- rf_type: %s\n", value );

                else if ( !strcmp( name, "filter") )
                    printf("- filter: %s\n", value );

                else 
                    printf("Unexpected message. Name: '%s', Value: '%s'.\n", name,value );

                field = json_getSibling( field );
        }            
    } 

或者按名字获取他们的价值观。这有助于您节省大量的源代码行和开发时间。

char str[] = "{\"command\":\"qwerty\",\"rf_type\":2,\"filter\":\"low pass\"}";
puts( str );

json_t pool[4];
json_t const* root = json_create( str, pool, 4 );

if ( root ) {

    char const* command = json_getPropertyValue( root, "command" );
    if ( command ) printf("- command: %s\n", command );

    char const* rf_type = json_getPropertyValue( root, "rf_type" );
    if ( rf_type ) printf("- rf_type: %s\n", rf_type );

    char const* filter = json_getPropertyValue( root, "filter" );
    if ( filter ) printf("- filter: %s\n", filter );        
}

如果要将json属性保留在文本中,则必须使用strcpy()创建字符串副本。