/*************************************************
* 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;
}
歡迎關注並加入物聯網行業聯盟,積累行業人脈和資源。