cJSON实例

/*************************************************
* example json file
* name    file
*    {
*            "firstname":"lin",
*            "lastname":"spock",
*            "age":"25",
*            "address":{
*                    "city": "New York",
*                    "country":"USA",
*                    "street":["11","22","33"]
*            },
*            "hobbies":["basketball","football"],
*            "new":["new"]
*    }
*************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include "cJSON.h"                                                 

void Set(cJSON *root, char *str3, char *str4, char *str5, char *str6) {                                 /*json filename set fathercjson childcjson newvalue*/

    if (strcmp(str3, "root") == 0) {                                                                    /*jsona file set root firstname chen*/
        cJSON *tmp_json = cJSON_GetObjectItem(root, str4);
        if (tmp_json != NULL) {
            cJSON_ReplaceItemInObject(root, str4, cJSON_CreateString(str5));
        } else {
            fprintf(stderr, "%s元素不存在,請先添加\n", str4);
            fprintf(stdout, "新增元素命令格式:程序 json文件名 add object|array 父元素 子元素 新值\n");
            exit(0);
        }
    } else {
        cJSON *tmp_json = cJSON_GetObjectItem(root, str3);
        if (tmp_json != NULL) {
            if (tmp_json->type == cJSON_Object) {                                                        /*json file set address city Beijing*/
                cJSON *obj_json = cJSON_GetObjectItem(tmp_json, str4);
                if (obj_json != NULL) {
                    cJSON_ReplaceItemInObject(tmp_json, str4,
                            cJSON_CreateString(str5));
                } else {
                    fprintf(stderr, "%s元素不存在,请先创建\n", str4);
                    exit(0);
                }

            } else if (tmp_json->type == cJSON_Array) {                                                    /*json file set hobbies 1 readbook*/

                int count = cJSON_GetArraySize(tmp_json);
                if (atoi(str4) < (count + 1) && atoi(str4) > 0) {
                    cJSON_ReplaceItemInArray(tmp_json, atoi(str4) - 1,
                            cJSON_CreateString(str5));
                } else {
                    fprintf(stderr, "该数组不存在第%s个元素,请重新输入\n", str4);
                    exit(0);
                }

            }
        } else {
            fprintf(stderr, "%s元素不存在,請先添加\n", str3);
            fprintf(stdout,
                    "新增元素命令格式:程序 json文件名 add object|array 父元素 子元素 新值\n");
            exit(0);
        }
    }
}

void Add(cJSON *root, char *str3, char *str4, char *str5, char *str6) {                                        /*json filename add object fathercjson childcjson addvlaue*/

    if (strcmp(str3, "object") == 0) {

        if (strcmp(str4, "root") == 0) {                                                                    /*jsona file add object root test test*/
            cJSON *tmp_json = cJSON_GetObjectItem(root, str5);
            if (tmp_json != NULL) {
                fprintf(stderr, "%s元素已存在,請先删除\n", str5);
                fprintf(stdout, "删除命令:程序 json文件名 delete 父元素 子元素\n");
                exit(0);
            } else {
                cJSON_AddItemToObject(root, str5, cJSON_CreateString(str6));
            }
        } else {                                                                                            /*json file add object address planet eirth*/
            cJSON *tmp_json = cJSON_GetObjectItem(root, str4);
            if (tmp_json != NULL) {
                if (tmp_json->type == cJSON_Object) {

                    cJSON *obj_json = cJSON_GetObjectItem(tmp_json, str5);
                    if (obj_json != NULL) {
                        fprintf(stderr, "%s元素已存在,請先删除\n", str5);
                        fprintf(stdout, "删除命令:程序 json文件名 delete 父元素 子元素\n");
                        exit(0);
                    } else {
                        cJSON_AddItemToObject(tmp_json, str5,
                                cJSON_CreateString(str6));
                    }

                } else if (tmp_json->type == cJSON_Array) {
                    cJSON *obj_json = cJSON_CreateObject();
                    cJSON_AddItemToArray(tmp_json, obj_json);
                    cJSON_AddStringToObject(obj_json, str5, str6);

                }
            } else {
                fprintf(stderr, "%s元素不存在,请在上一级先添加%s\n", str4, str4);
                exit(0);
            }

        }

    } else if (strcmp(str3, "array") == 0) {                                                                 /*json filename add array fathercjson childcjson addvalue*/

        if (strcmp(str4, "root") == 0) {                                                                    /*jsona file add array root hobbies vallyball*/
            cJSON *tmp_json = cJSON_GetObjectItem(root, str5);
            if (tmp_json != NULL) {
                cJSON_AddItemToArray(tmp_json, cJSON_CreateString(str6));
            } else {
                cJSON *tmp_json = cJSON_CreateArray();
                cJSON_AddItemToObject(root, str5, tmp_json);
                cJSON_AddItemToArray(tmp_json, cJSON_CreateString(str6));
            }

        } else {                            
            fprintf(stderr, "%s数组下尚不能添加二级数组或对象\n", str4);
            exit(0);
            /*
             cJSON *tmp_json = cJSON_GetObjectItem(root, str4);
             cJSON *arr_json = cJSON_GetObjectItem(tmp_json, str5);
             if (arr_json != NULL) {
             cJSON_AddItemToArray(arr_json, cJSON_CreateString(str6));
             } else {
             cJSON *arr_json = cJSON_CreateArray();
             cJSON_AddItemToObject(tmp_json, str5, arr_json);
             cJSON_AddItemToArray(arr_json, cJSON_CreateString(str6));
             }
             */
        }

    } else {
        fprintf(stderr, "第三个参数可选值为: object|array,请重新输入\n");
        exit(0);
    }

}

void Delete(cJSON *root, char *str3, char *str4) {                                                             /*json filename delete fathercjson childcjson*/

    if (strcmp(str3, "root") == 0) {                                                                        /*/json file delete root firstname*/
        cJSON *tmp_json = cJSON_GetObjectItem(root, str4);
        if (tmp_json != NULL) {
            cJSON_DeleteItemFromObject(root, str4);
        } else {
            fprintf(stderr, "%s元素不存在,请重新输入\n", str4);
            exit(0);
        }

    } else {
        cJSON *tmp_json = cJSON_GetObjectItem(root, str3);
        if (tmp_json != NULL) {                                                                                /*json file delete address city*/

            if (tmp_json->type == cJSON_Object) {
                cJSON *obj_json = cJSON_GetObjectItem(tmp_json, str4);
                if (obj_json != NULL) {
                    cJSON_DeleteItemFromObject(tmp_json, str4);
                } else {
                    fprintf(stderr, "%s元素不存在,请重新输入\n", str4);
                    exit(0);
                }

            } else if (tmp_json->type == cJSON_Array) {                                                     /*json file delete hobbies 2*/
                int count = cJSON_GetArraySize(tmp_json);

                if (atoi(str4) < (count + 1) && atoi(str4) > 0) {    
                    cJSON_DeleteItemFromArray(tmp_json, atoi(str4) - 1);
                } else {
                    fprintf(stderr, "该数组不存在第%s个元素,请重新输入\n", str4);
                    (0);
                }
            }
        } else {
            fprintf(stderr, "%s元素不存在,请重新输入\n", str3);
            exit(0);
        }

    }
}

int main(int argc, char *argv[]) {

    FILE *fp = fopen(argv[1], "r");                                                                         /*从文件中读取要解析的JSON数据*/

    if (fp == NULL) {
        fprintf(stderr, "第二个参数为文件名,%s文件打开失败\n");
        exit(0);
    }

    fseek(fp, 0, SEEK_END);                                                                                 /*将指针指向文件末尾*/
    long len = ftell(fp);                                                                                     /*ftell获得当前指针位置相对于文件首的偏移字节数*/
    fseek(fp, 0, SEEK_SET);                                                                                 /*再将指针指回开头*/

    char *data = (char*) malloc(len + 1);                                                                     /*分配内存*/
    fread(data, 1, len, fp);                                                                                 /*printf("%s\n", data)*/
    fclose(fp);

    cJSON *root = cJSON_Parse(data);                                                                        /*将字符串解析成json结构体*/
    char *ro = cJSON_Print(root);                                                                             /*可通过这个指针输出内容测试*/
    if (NULL == root) {
        fprintf(stderr, "error:%s\n", cJSON_GetErrorPtr());
        cJSON_Delete(root);
    }

    if (strcmp(argv[2], "set") == 0) {                                                                         /*改*/
        if (argc != 6) {
            fprintf(stderr, "参数过少或过多\n");
            fprintf(stdout, "set命令参数有6个\n命令格式:程序 json文件名 set 父元素 子元素 新值\n");
            exit(0);
        }
        Set(root, argv[3], argv[4], argv[5], argv[6]);

    } else if (strcmp(argv[2], "add") == 0) {                                                                 /*增*/
        if (argc != 7) {
            fprintf(stderr, "参数过少或过多\n");
            fprintf(stdout,"add命令参数有7个\n命令格式:程序 json文件名 add object|array 父元素 子元素 新值\n");
            exit(0);
        }
        Add(root, argv[3], argv[4], argv[5], argv[6]);

    } else if (strcmp(argv[2], "delete") == 0) {                                                             /*删*/
        if (argc != 5) {
            fprintf(stderr, "参数过少或过多\n");
            fprintf(stdout, "delete命令参数有五个\n命令格式:程序 json文件名 delete 父元素 子元素\n");
            exit(0);
        }
        Delete(root, argv[3], argv[4]);

    } else {
        fprintf(stderr, "第三个参数错误\n"
                "第三个参数为:set | add | delete\n");
        fprintf(stdout, "具体命令格式为:\n"
                "修改:程序 json文件名 set 父元素 子元素 新值\n"
                "添加:程序 json文件名 add object|array 父元素 子元素 新值\n"
                "删除:程序 json文件名 delete 父元素 子元素\n"
                "當所要操作元素在最外層時父元素為\"root\"\n");
        exit(0);
    }

    FILE *file;
    file = fopen("file3", "wb");                                                                             /*将cjson写入文件*/
    char *out = cJSON_Print(root);
    fprintf(file, "%s", out);
    fclose(file);
    free(out);

    return 1;
}




  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
cJSON遍历实例代码如下: ```c #include <stdio.h> #include "cJSON.h" void traverse(cJSON *root) { if (root == NULL) { return; } switch (root->type) { case cJSON_False: printf("False\n"); break; case cJSON_True: printf("True\n"); break; case cJSON_NULL: printf("NULL\n"); break; case cJSON_Number: printf("Number: %lf\n", root->valuedouble); break; case cJSON_String: printf("String: %s\n", root->valuestring); break; case cJSON_Array: printf("Array:\n"); cJSON *child = root->child; while (child != NULL) { traverse(child); child = child->next; } break; case cJSON_Object: printf("Object:\n"); cJSON *item = root->child; while (item != NULL) { printf("Key: %s\n", item->string); traverse(item); item = item->next; } break; default: break; } } int main() { const char *jsonStr = "{\"name\":\"John\",\"age\":30,\"city\":\"New York\"}"; cJSON *root = cJSON_Parse(jsonStr); traverse(root); cJSON_Delete(root); return 0; } ``` 上述代码通过cJSON库解析了一个JSON字符串,并实现了遍历JSON对象的功能。遍历函数traverse()通过递归地遍历cJSON对象的子节点,根据节点的类型打印出相应的信息。在主函数中,我们首先将JSON字符串解析为cJSON对象,然后调用traverse()函数进行遍历,最后释放资源。 希望以上代码能对您有所帮助。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [ESP32-C3入门教程 系统篇④——cJSON应用实例 | C语言中超轻量级JSON解析器](https://blog.csdn.net/kangweijian/article/details/124579543)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [cJSON方法详解](https://blog.csdn.net/jhyBOSS/article/details/108375390)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值