首页 > 代码库 > 根据百度的语音识别例子,展示C如何使用cJSON
根据百度的语音识别例子,展示C如何使用cJSON
前面一篇文章展示了根据百度语音识别例子如何用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