文章目录
-
- [struct 转 json](#struct 转 json)
- [json 转 struct](#json 转 struct)
文档: https://github.com/DaveGamble/cJSON
项目结构
bash
.
├── libs
│ ├── cJSON.c
│ └── cJSON.h
└── main.c
示例
struct 转 json
c
#include "libs/cJSON.h"
#include <stdio.h>
// define data struct
typedef struct Student
{
int age;
char *name;
} Student;
int main(int argc, char const *argv[])
{
// 1. create struct
Student student;
student.age = 18;
student.name = "Tom";
// 2. struct to json object
cJSON *item = cJSON_CreateObject();
if (cJSON_AddStringToObject(item, "name", student.name) == NULL)
{
goto end;
}
if (cJSON_AddNumberToObject(item, "age", student.age) == NULL)
{
goto end;
}
// 3. print json string
char *json = cJSON_Print(item);
printf("%s\n", json);
// 4. free json
end:
cJSON_Delete(item);
return 0;
}
输出
bash
$ gcc main.c libs/cJSON.c && ./a.out
{
"name": "Tom",
"age": 18
}
json 转 struct
c
#include "libs/cJSON.h"
#include <stdio.h>
#include <memory.h>
// define data struct
typedef struct Student
{
int age;
char *name;
} Student;
char *Student_to_string(char *result, Student *student)
{
if (student == NULL)
{
return result;
}
sprintf(result,
"Student {\n name: \"%s\",\n age: %d\n}\n",
student->name,
student->age);
return result;
}
int main(int argc, char const *argv[])
{
Student student;
cJSON *item;
cJSON *name_item;
cJSON *age_item;
char result[100];
char *json = "{\"name\": \"Tom\",\"age\": 18}";
// 1. parse json
item = cJSON_Parse(json);
if (item == NULL)
{
const char *error_ptr = cJSON_GetErrorPtr();
if (error_ptr != NULL)
{
fprintf(stderr, "Error before: %s\n", error_ptr);
}
goto end;
}
// 2. convert to struct
name_item = cJSON_GetObjectItem(item, "name");
if(cJSON_IsString(name_item) && name_item->valuestring != NULL){
student.name = name_item->valuestring;
}
age_item = cJSON_GetObjectItem(item, "age");
if(cJSON_IsNumber(age_item)){
student.age = age_item->valueint;
}
Student_to_string(result, &student);
printf("%s", result);
end:
// 3. free json
cJSON_Delete(item);
return 0;
}
输出
bash
$ gcc main.c libs/cJSON.c && ./a.out
Student {
name: "Tom",
age: 18
参考
cJSON库学习------C语言结构体与JSON互相转换