123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- #include <stdlib.h>
- #include <string.h>
- #include <fcntl.h>
- #include <sys/stat.h>
- #include <errno.h>
- #include <unistd.h>
- #include <stdarg.h>
- #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++;
- }
- }
- }
- }
|