在使用c socket進行網(wǎng)絡通信時,有時候需要接收來自其他應用程序發(fā)送的json格式的數(shù)據(jù)。接收json格式的數(shù)據(jù)需要配合cJson庫使用。
示例代碼如下:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h> #include <cJSON.h> #define BUF_SIZE 1024 int main(int argc, char *argv[]) { struct sockaddr_in serv_addr; int sock; char buf[BUF_SIZE]; cJSON *root; cJSON *item; cJSON *array_item; int i; sock = socket(PF_INET, SOCK_STREAM, 0); if(sock == -1) { perror("socket() error"); exit(1); } memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = inet_addr(argv[1]); serv_addr.sin_port = htons(atoi(argv[2])); if(connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1) { perror("connect() error"); exit(1); } while(1) { if(recv(sock, buf, BUF_SIZE, 0) == -1) { perror("recv() error"); exit(1); } root = cJSON_Parse(buf); //將接收到的數(shù)據(jù)解析成json對象 item = cJSON_GetObjectItem(root, "name"); //獲取name字段的值,并輸出 if(item != NULL) printf("name: %s\n", item->valuestring); item = cJSON_GetObjectItem(root, "age"); //獲取age字段的值,并輸出 if(item != NULL) printf("age: %d\n", item->valueint); item = cJSON_GetObjectItem(root, "hobbies"); //獲取hobbies字段的值,并輸出 if(item != NULL) { printf("hobbies:\n"); for(i = 0; i< cJSON_GetArraySize(item); i++) { array_item = cJSON_GetArrayItem(item, i); printf("%s\n", array_item->valuestring); } } printf("\n"); cJSON_Delete(root); //釋放json對象的內存 } close(sock); return 0; }
在接收到json數(shù)據(jù)后,先使用cJSON_Parse函數(shù)將接收到的數(shù)據(jù)解析成json對象,然后使用cJSON_GetObjectItem函數(shù)獲取需要的字段值,最后使用cJSON_Delete函數(shù)釋放內存。