標籤:
前面一篇文章展示了根據百度語音辨識例子如何用C調用C++的方法,這篇文章也是基於百度語音辨識,展示如何使用cJSON,cJSON是一個用C寫的JSON解析器,非常好用,可以用它來產生一個JSON,也可以用來解析JSON的值。
在我寫的通過skey擷取token的代碼中
char *token = (char *)malloc(MAX_BUFFER_SIZE);
char host[MAX_BUFFER_SIZE];
snprintf(host, sizeof(host),
"https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id=%s&client_secret=%s",
apiKey, secretKey);
FILE *fpp = NULL;
char cmd[MAX_BUFFER_SIZE];
char *result = (char *)malloc(MAX_RESULT_SIZE);
char *curl_cmd = "curl -s ";
char *yinhao = "\"";
strcpy(cmd, curl_cmd);
strcat(cmd, yinhao);
strcat(cmd, host);
strcat(cmd, yinhao);
fpp = popen(cmd, "r");
printf("\n%s\n", cmd);
fgets(result, MAX_RESULT_SIZE, fpp);
pclose(fpp);
if (result != NULL)
{
cJSON *root;
root = cJSON_Parse(result);
if (!root)
{
printf("\nGet root Failed");
return -1;
}
token1 = cJSON_GetObjectItem(root, "access_token")->valuestring;
strcpy(token, token1);
printf("\n%s\n", token);
cJSON_Delete(root);
free(result);
}
result是JSON結果,得到JSON後如何取得各節點的值呢?就需要用到if(result!=NULL)裡的代碼了,首先cJSON先定義一個root節點 cJSON *root,然後通過cJSON_Parse獲得根節點,有根節點的話,就通過cJSON_GetObjectItem(root,"access_token")擷取根下面的一級的access_token的值,它的JSON結構是這樣
{
access_tokeen:XXXXXX,
len:XXXXXXX
}
,用完後要cJSON_Delete。
百度語音辨識post的時候提交的是json,所以需要組裝一個json,組裝的代碼如下:
cJSON *buffer;
buffer = cJSON_CreateObject();
cJSON_AddItemToObject(buffer, "format", cJSON_CreateString("pcm"));
cJSON_AddItemToObject(buffer, "rate", cJSON_CreateString("8000"));
cJSON_AddItemToObject(buffer, "channel", cJSON_CreateString("1"));
cJSON_AddItemToObject(buffer, "token", cJSON_CreateString(token));
cJSON_AddItemToObject(buffer, "cuid", cJSON_CreateString(cuid));
cJSON_AddItemToObject(buffer, "len", cJSON_CreateString(content_length));
cJSON_AddItemToObject(buffer, "speech", cJSON_CreateString(decode_data));
通過cJSON_CreateObject來撞見一個對象,然後通過cJSON_AddItemToObject往對象裡添加節點,cJSON_AddItemToObject(buffer, "format", cJSON_CreateString("pcm")); format是節點名稱,pcm是節點的值。
產生後的效果就是
根據百度的語音辨識例子,展示C如何使用cJSON