2016-12-23 14 views
0

JSMNライブラリ実装の下。着信JSONメッセージの "command"、 "rf_type"、 "Filter"を検索します。これで、抽出された文字列が自動的に印刷されます。私はそれを別の変数に渡し、その文字列を別の関数で使用する必要があります。Cでの文字列の抽出

スタート - >この場合、変数に印刷された文字列を取る方法を導くことができるエンド>別の機能 - に渡す> 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; 
+1

バッファに "印刷"するには(http://pubs.opengroup.org/onlinepubs/9699919799/functions/fprintf.html)(またはC99実装の場合は 'snprintf')[' sprintf']できます。 – pmg

答えて

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; 
} 
0
else 
    { 
    printf("Unexpected messages HUB_HCI: %.*s\n", t[i].end-t[i].start, 
      JSON_STRING + t[i].start); 
    } 

ルックスJSON_STRINを追加なぜ に非常に疑わしい私は

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

を期待しますG列挙型定数をポインタに渡す?

0

tiny-jsonを使用することを検討してください。トークナイザーだけではありません。文字列形式でデータを取得したり、パフォーマンスの低下なしにC型変数でプリミティブ値を取得することができます。

2通りの方法で使用できます。 JSONフィールドを1つずつ取得できます。

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()を使用して文字列をコピーする必要があります。