pxJson.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include <fcntl.h>
  4. #include <sys/stat.h>
  5. #include <errno.h>
  6. #include <unistd.h>
  7. #include <stdarg.h>
  8. #include "pxTools.h"
  9. #include "pxJson.h"
  10. JSONFILE_S *JsonFileOpen(char *path,char *file)
  11. {
  12. char *buf=NULL;
  13. FILE *tmpFp = NULL;
  14. struct stat file_stat;
  15. cJSON* body_json=NULL;
  16. char *fileName=NULL;
  17. if(file!=NULL)
  18. asprintf(&fileName,"%s/%s",path,file);
  19. else
  20. asprintf(&fileName,"%s",path);
  21. if(!fileName)
  22. {
  23. return NULL;
  24. }
  25. if (!(tmpFp = fopen(fileName, "a+")))
  26. {
  27. //创建失败
  28. free(fileName);
  29. return NULL;
  30. }
  31. free(fileName);
  32. flock(fileno(tmpFp),LOCK_EX);
  33. fcntl(fileno(tmpFp), F_SETFD, FD_CLOEXEC);
  34. if(fstat(fileno(tmpFp), &file_stat) == 0 )
  35. {
  36. if( file_stat.st_size!=0 )
  37. {
  38. buf=(char*)malloc(file_stat.st_size+1);
  39. if(!buf){
  40. return NULL;
  41. }
  42. fgets(buf, file_stat.st_size+1, tmpFp);
  43. buf[file_stat.st_size]=0;
  44. body_json=cJSON_Parse(buf);
  45. }
  46. }
  47. if(buf)
  48. {
  49. free(buf);
  50. }
  51. if(!body_json)
  52. {
  53. body_json=cJSON_CreateObject();
  54. if(!body_json)
  55. {
  56. return NULL;
  57. }
  58. }
  59. if(body_json->type!=cJSON_Object)
  60. {
  61. cJSON_Delete(body_json);
  62. return NULL;
  63. }
  64. JSONFILE_S *jf=new(JSONFILE_S);
  65. if(jf==NULL)
  66. return NULL;
  67. jf->fd=tmpFp;
  68. jf->body_json=body_json;
  69. return jf;
  70. }
  71. cJSON* cJSON_GetOrCreateObjectItem(cJSON* jsonTmp,char *nameTmp)
  72. {
  73. if(!jsonTmp || !nameTmp)
  74. return NULL;
  75. cJSON* value_json=cJSON_GetObjectItem(jsonTmp,nameTmp);
  76. if(value_json==NULL)
  77. {
  78. value_json=cJSON_CreateObject();
  79. if(!value_json)
  80. return NULL;
  81. cJSON_AddItemToObject(jsonTmp,nameTmp,value_json);
  82. }
  83. return value_json;
  84. }
  85. void JsonFileSet(JSONFILE_S * jf,cJSON *obj,char *name, ...)
  86. {
  87. if(!obj || !jf || !name || !jf->body_json)
  88. {return;}
  89. char *fmt = NULL;
  90. va_list valist;
  91. va_start(valist, name);
  92. vasprintf(&fmt, name, valist);
  93. va_end(valist);
  94. if(!fmt)
  95. return;
  96. if(fmt[0]==0)
  97. {
  98. free(fmt);
  99. return;
  100. }
  101. char *t=fmt;
  102. char *nameTmp=fmt;
  103. cJSON* jsonTmp=jf->body_json;
  104. while(*t!=0)
  105. {
  106. if(*t=='.')
  107. {
  108. *t=0;
  109. cJSON* value_json=cJSON_GetOrCreateObjectItem(jsonTmp,nameTmp);
  110. jsonTmp=value_json;
  111. nameTmp=t+1;
  112. }
  113. t++;
  114. }
  115. cJSON_setItem(jsonTmp,nameTmp,obj);
  116. free(fmt);
  117. return;
  118. }
  119. void JsonFileClose(JSONFILE_S * jf)
  120. {
  121. if(!jf || !jf->body_json)
  122. return;
  123. char *printData=cJSON_PrintUnformatted(jf->body_json);
  124. ftruncate(fileno(jf->fd), 0);
  125. fputs(printData,jf->fd);
  126. fflush(jf->fd);
  127. flock(fileno(jf->fd),LOCK_UN);
  128. fclose(jf->fd);
  129. cJSON_Delete(jf->body_json);
  130. free(jf);
  131. free(printData);
  132. }
  133. char* JsonGetStr(cJSON* json,char *name)
  134. {
  135. if(!json || json->type!=cJSON_Object)
  136. {
  137. return NULL;
  138. }
  139. cJSON* jsonStr=cJSON_GetObjectItem(json,name);
  140. if(jsonStr && jsonStr->type==cJSON_String)
  141. return jsonStr->valuestring;
  142. return NULL;
  143. }
  144. void JsonFillStrArry(cJSON* json,char *name,char ***value)
  145. {
  146. if(!json || json->type!=cJSON_Object)
  147. {
  148. return;
  149. }
  150. cJSON* jsonStr=cJSON_GetObjectItem(json,name);
  151. if(jsonStr && jsonStr->type==cJSON_Array)
  152. {
  153. cJSON* valueJson=NULL;
  154. int len=cJSON_GetArraySize(jsonStr);
  155. int curPos=0;
  156. *value=(char**)malloc(sizeof(char*)*(len+1));
  157. memset(*value,0,sizeof(char*)*(len+1));
  158. cJSON_ArrayForEach(valueJson,jsonStr)
  159. {
  160. if(valueJson && valueJson->type==cJSON_String)
  161. {
  162. (*value)[curPos]=strdup(valueJson->valuestring);
  163. curPos++;
  164. }
  165. }
  166. }
  167. }