C语言:cJSON将struct结构体与JSON互相转换

文章目录

    • [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互相转换

https://www.cnblogs.com/BearMan0047/p/16063422.html

相关推荐
2601_962071573 小时前
【Java报错已解决】org.springframework.beans.factory.BeanCreationException
java·开发语言
淡海水4 小时前
07-04-并发-ConcurrentBag-T-工作窃取WorkStealing算法
开发语言·算法·c#·bag·concurrent·workstealing
CS_Zero5 小时前
C语言sizeof是函数吗?
c语言·开发语言
-今昭-5 小时前
《V2V 迁移实战:将 VMware 虚拟机转为 OpenStack 可用 Glance qcow2 镜像》
开发语言·python
黑马程序员毕设7 小时前
基于Java的医院药品管理系统的优化设计与实现
java·开发语言·spring boot·小程序·架构·课程设计·毕设
_Twink1e8 小时前
openJiuwen 实训营 Day 1 · WorkSwarm 入门教程
开发语言·c++·openjiuwen
问天_观心8 小时前
大模型微调学习(一)
开发语言·人工智能·学习·语言模型·github
阿里嘎多学长8 小时前
2026-09-03 GitHub 热点项目精选
开发语言·程序员·github·代码托管
Navigator_Z8 小时前
LeetCode //C - 1224. Maximum Equal Frequency
c语言·算法·leetcode
Navigator_Z9 小时前
LeetCode //C++ - 1226. The Dining Philosophers
c语言·算法·leetcode