/// Basic and really simplistic routine to fix malformatted .json files /// It will replace the old version of your file on success and create a backup of the old one (called <filename>_backup.json) /// Currently it fixes: double commata, missing " for non-numeric strings int JSON_Fix(const char *filename) { string s; copystring(s, filename); const char *found = findfile(path(s), ""); char *buf = loadfile(found, NULL); if(!buf) return -1; JSON_Minify(buf); size_t len = strlen(buf); char *newbuf = new char[len + 1]; size_t pos = 0; //current position in the newbuf for(size_t i = 0; i < len; i++) { if(buf[i] == ',') { if(!i) i++; //buf starts with a commata else if(buf[i + 1] == ',') i++; //two subsequent commata else { newbuf[pos] = buf[i]; pos++; } } else if(isalpha(buf[i])) { if(!i) //todo worst case: is it an array or object? return 0; else if(buf[i - 1] != '\"') { newbuf[pos] = '\"'; pos++; } //string was missing a leading " newbuf[pos] = buf[i]; pos++; } else { if(i && isalpha(i - 1)) { newbuf[pos] = '\"'; pos++; } //string was missing a trailing " newbuf[pos] = buf[i]; pos++; } } JSON *j = JSON_Parse(newbuf); if(j) { conoutf("%s was malformatted but has been fixed automatically. \nThe original file has been overwritten, but backuped", found); //cutextension .. getextension defformatstring(backupname, "%s_backup", found); if(!rename(found, backupname)) j->save(found); delete j; delete[] buf; delete[] newbuf; return 1; } delete[] buf; delete[] newbuf; return 0; }
// Parses a JSON schedule into the global variable // schedule and sorts it void scheduleParse(char *json) { JSON_Parse(json); }