如何将cjson封装成函数供外部函数调用
时间: 2024-05-03 21:21:33 浏览: 17
首先需要将cjson的头文件引入进来:
```
#include "cJSON.h"
```
然后可以将cjson封装成一个函数,函数的返回值可以是一个字符串或者一个结构体,具体根据实际情况而定。下面是一个将json字符串转换成cjson对象的函数:
```
cJSON* json_to_cjson(char* json_str) {
cJSON* root = cJSON_Parse(json_str);
return root;
}
```
该函数接收一个json字符串作为参数,返回一个cJSON的指针。在函数内部,使用cJSON_Parse函数将json字符串解析成一个cJSON对象,并将该对象返回。此时,外部函数可以通过调用该函数来获取cJSON对象,并进行相关操作。
还可以将cjson封装成一个将cjson对象转换成json字符串的函数:
```
char* cjson_to_json(cJSON* root) {
char* json_str = cJSON_Print(root);
return json_str;
}
```
该函数接收一个cJSON对象作为参数,返回一个字符串。在函数内部,使用cJSON_Print函数将cJSON对象转换成json字符串,并将该字符串返回。此时,外部函数可以通过调用该函数将cJSON对象转换成json字符串。
相关问题
如何将cjson调用封装成函数供外部调用
1. 首先需要在外部调用的头文件中引入cjson的头文件。
```
#include "cJSON.h"
```
2. 然后定义一个函数,该函数的返回值为cJSON类型的指针,表示该函数返回一个cJSON对象。
```
cJSON* createJson();
```
3. 在函数中创建一个cJSON对象,并设置该对象的值。
```
cJSON* createJson() {
cJSON* root = cJSON_CreateObject();
cJSON_AddStringToObject(root, "name", "张三");
cJSON_AddNumberToObject(root, "age", 18);
return root;
}
```
4. 在外部调用时,只需调用该函数即可获取cJSON对象。
```
cJSON* json = createJson();
```
完整代码如下:
```
#include "cJSON.h"
cJSON* createJson() {
cJSON* root = cJSON_CreateObject();
cJSON_AddStringToObject(root, "name", "张三");
cJSON_AddNumberToObject(root, "age", 18);
return root;
}
int main() {
cJSON* json = createJson();
char* strJson = cJSON_Print(json);
printf("%s\n", strJson);
cJSON_Delete(json);
free(strJson);
return 0;
}
```
将上述代码封装成一个函数
好的,这里是我封装后的代码,函数的参数依次为 JSON 字符串指针、密钥、签名键名:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/hmac.h>
#include "cJSON.h"
char *sortJsonString(cJSON *json);
char *getSign(char *jsonString, char *key);
char *addSignToJson(char *jsonString, char *key, char *signKey);
char *sortJsonString(cJSON *json) {
int count = cJSON_GetArraySize(json);
char **keys = (char **) malloc(count * sizeof(char *));
int i = 0;
cJSON_ArrayForEach(json, json) {
keys[i++] = strdup(json->string);
}
qsort(keys, count, sizeof(char *), strcmp);
char *sortString = (char *) malloc(1);
sortString[0] = '\0';
for (int i = 0; i < count; i++) {
cJSON *item = cJSON_GetObjectItemCaseSensitive(json, keys[i]);
if (item->type == cJSON_Object) {
char *subSortString = sortJsonString(item);
sortString = (char *) realloc(sortString, strlen(sortString) + strlen(keys[i]) + strlen(subSortString) + 3);
sprintf(sortString + strlen(sortString), "%s=%s&", keys[i], subSortString);
free(subSortString);
} else {
sortString = (char *) realloc(sortString, strlen(sortString) + strlen(keys[i]) + strlen(item->valuestring) + 3);
sprintf(sortString + strlen(sortString), "%s=%s&", keys[i], item->valuestring);
}
}
sortString[strlen(sortString) - 1] = '\0';
cJSON_ArrayForEach(json, json) {
free(keys[--i]);
}
free(keys);
return sortString;
}
char *getSign(char *jsonString, char *key) {
char *sortString = sortJsonString(cJSON_Parse(jsonString));
unsigned char *hmac = HMAC(EVP_sha256(), key, strlen(key), (const unsigned char *) sortString, strlen(sortString), NULL, NULL);
char *sign = (char *) malloc(65);
for (int i = 0; i < 32; i++) {
sprintf(&sign[i * 2], "%02x", hmac[i]);
}
sign[64] = '\0';
free(sortString);
return sign;
}
char *addSignToJson(char *jsonString, char *key, char *signKey) {
char *sign = getSign(jsonString, key);
cJSON *json = cJSON_Parse(jsonString);
cJSON_AddStringToObject(json, signKey, sign);
char *result = cJSON_Print(json);
free(sign);
cJSON_Delete(json);
return result;
}
```
`addSignToJson` 函数将前面的代码封装起来,并将签名键名作为参数传入。函数返回一个新的 JSON 字符串指针,需要注意在使用后释放内存。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)