void parse_and_callback(struct ee_fieldbucket *fields, cJSON *item, char *prefix) { char *name; char *newprefix; int lenprefix; int bNeedFree; int dorecurse; //printf("parse_and_callback, item %p, item->string %p, prefix(%d): '%s'\n", item, item->string, strlen(prefix), prefix); while (item) { lenprefix = strlen(prefix); if(lenprefix == 0) { newprefix = (item->string == NULL) ? "" : item->string; bNeedFree = 0; } else { name = (item->string == NULL) ? "*" : item->string; newprefix=malloc(strlen(prefix)+strlen(name)+2); sprintf(newprefix,"%s.%s",prefix,name); bNeedFree = 1; } dorecurse = callback(fields, newprefix, item->type, item); if (item->child && dorecurse) parse_and_callback(fields, item->child,newprefix); item=item->next; if(bNeedFree) free(newprefix); } }
void parse_and_callback(cJSON *item) { while(item) { printf("type=%d, string=%s valuestring=%s\n",item->type,item->string,item->valuestring); if (item->child) parse_and_callback(item->child); item = item->next; } }
/* Parse text to JSON, then render back to text, and print! */ void doit(char *text) { char *out;cJSON *json; json=cJSON_Parse(text); if (!json) {printf("Error before: [%s]\n",cJSON_GetErrorPtr());} else { parse_and_callback(json); // out=cJSON_Print(json); cJSON_Delete(json); // printf("%s\n",out); free(out); } }
struct ee_event* ee_newEventFromJSON(ee_ctx ctx, char *str) { struct cJSON *json; struct ee_event *e = NULL; json = cJSON_Parse(str); if(json == NULL) goto done; e = ee_newEvent(ctx); e->fields = ee_newFieldbucket(ctx); parse_and_callback(e->fields, json, ""); cJSON_Delete(json); done: return e; }