#include #include #include #include #include #include #include #include "pxTools.h" #include "pxJson.h" JSONFILE_S *JsonFileOpen(char *path,char *file) { char *buf=NULL; FILE *tmpFp = NULL; struct stat file_stat; cJSON* body_json=NULL; char *fileName=NULL; if(file!=NULL) asprintf(&fileName,"%s/%s",path,file); else asprintf(&fileName,"%s",path); if(!fileName) { return NULL; } if (!(tmpFp = fopen(fileName, "a+"))) { //创建失败 free(fileName); return NULL; } free(fileName); flock(fileno(tmpFp),LOCK_EX); fcntl(fileno(tmpFp), F_SETFD, FD_CLOEXEC); if(fstat(fileno(tmpFp), &file_stat) == 0 ) { if( file_stat.st_size!=0 ) { buf=(char*)malloc(file_stat.st_size+1); if(!buf){ return NULL; } fgets(buf, file_stat.st_size+1, tmpFp); buf[file_stat.st_size]=0; body_json=cJSON_Parse(buf); } } if(buf) { free(buf); } if(!body_json) { body_json=cJSON_CreateObject(); if(!body_json) { return NULL; } } if(body_json->type!=cJSON_Object) { cJSON_Delete(body_json); return NULL; } JSONFILE_S *jf=new(JSONFILE_S); if(jf==NULL) return NULL; jf->fd=tmpFp; jf->body_json=body_json; return jf; } cJSON* cJSON_GetOrCreateObjectItem(cJSON* jsonTmp,char *nameTmp) { if(!jsonTmp || !nameTmp) return NULL; cJSON* value_json=cJSON_GetObjectItem(jsonTmp,nameTmp); if(value_json==NULL) { value_json=cJSON_CreateObject(); if(!value_json) return NULL; cJSON_AddItemToObject(jsonTmp,nameTmp,value_json); } return value_json; } void JsonFileSet(JSONFILE_S * jf,cJSON *obj,char *name, ...) { if(!obj || !jf || !name || !jf->body_json) {return;} char *fmt = NULL; va_list valist; va_start(valist, name); vasprintf(&fmt, name, valist); va_end(valist); if(!fmt) return; if(fmt[0]==0) { free(fmt); return; } char *t=fmt; char *nameTmp=fmt; cJSON* jsonTmp=jf->body_json; while(*t!=0) { if(*t=='.') { *t=0; cJSON* value_json=cJSON_GetOrCreateObjectItem(jsonTmp,nameTmp); jsonTmp=value_json; nameTmp=t+1; } t++; } cJSON_setItem(jsonTmp,nameTmp,obj); free(fmt); return; } void JsonFileClose(JSONFILE_S * jf) { if(!jf || !jf->body_json) return; char *printData=cJSON_PrintUnformatted(jf->body_json); ftruncate(fileno(jf->fd), 0); fputs(printData,jf->fd); fflush(jf->fd); flock(fileno(jf->fd),LOCK_UN); fclose(jf->fd); cJSON_Delete(jf->body_json); free(jf); free(printData); } char* JsonGetStr(cJSON* json,char *name) { if(!json || json->type!=cJSON_Object) { return NULL; } cJSON* jsonStr=cJSON_GetObjectItem(json,name); if(jsonStr && jsonStr->type==cJSON_String) return jsonStr->valuestring; return NULL; } void JsonFillStrArry(cJSON* json,char *name,char ***value) { if(!json || json->type!=cJSON_Object) { return; } cJSON* jsonStr=cJSON_GetObjectItem(json,name); if(jsonStr && jsonStr->type==cJSON_Array) { cJSON* valueJson=NULL; int len=cJSON_GetArraySize(jsonStr); int curPos=0; *value=(char**)malloc(sizeof(char*)*(len+1)); memset(*value,0,sizeof(char*)*(len+1)); cJSON_ArrayForEach(valueJson,jsonStr) { if(valueJson && valueJson->type==cJSON_String) { (*value)[curPos]=strdup(valueJson->valuestring); curPos++; } } } }