diff --git a/.gitignore b/.gitignore index c6127b3..f9994ee 100644 --- a/.gitignore +++ b/.gitignore @@ -50,3 +50,7 @@ modules.order Module.symvers Mkfile.old dkms.conf +sj_test +libs/libsj.* +output.json + diff --git a/include/simple_json.h b/include/simple_json.h index bf99f70..3195f76 100644 --- a/include/simple_json.h +++ b/include/simple_json.h @@ -30,8 +30,9 @@ SJson *sj_load(const char *filename); * @brief write a json value as a formatted json string to file * @param json the struct to convert and write * @param filename the file to overwrite + * @param pretty bool to denote pretty output */ -void sj_save(SJson *json,const char *filename); +void sj_save(SJson *json,const char *filename, int pretty); /** * @brief make a new json value that is a string @@ -322,7 +323,7 @@ SJson *sj_array_nth(SJson *array,int n); * @brief print the contents of the json file to stdout * @param json the json struct to print */ -void sj_echo(SJson *json); +void sj_echo(SJson *json, int pretty); /** * @brief check if the json is an array diff --git a/include/simple_json_array.h b/include/simple_json_array.h index b69f967..34227db 100644 --- a/include/simple_json_array.h +++ b/include/simple_json_array.h @@ -26,6 +26,6 @@ SJString *sj_array_get_nth_as_string(SJson *array,int n); * @param array the json array to convert * @return a formatted json character array "[*,*,....]" */ -SJString *sj_array_to_json_string(SJson *array); +SJString *sj_array_to_json_string(SJson *array, int pretty); #endif diff --git a/include/simple_json_object.h b/include/simple_json_object.h index 9169d4e..0d0cb95 100644 --- a/include/simple_json_object.h +++ b/include/simple_json_object.h @@ -16,7 +16,12 @@ void sj_object_insert(SJson *object,const char *key,SJson *value); * @param object the object to convert * @return NULL on error, or a string encapsulated ith {} */ -SJString *sj_object_to_json_string(SJson *object); - +SJString *sj_object_to_json_string(SJson *object, int pretty); +/** + * @brief appends spaces for get_string(), nothing if 0 + * @param object the string to append to + * @param int amount of tabs to append offset by 1 + */ +void sj_pretty_append_spaces(SJString *object, int pretty); #endif diff --git a/include/simple_json_value.h b/include/simple_json_value.h index 4606ddb..4e89e54 100644 --- a/include/simple_json_value.h +++ b/include/simple_json_value.h @@ -24,7 +24,7 @@ typedef struct SJson_S SJList *array; /**json_free)json->json_free(json); } -void sj_save(SJson *json,const char *filename) +void sj_save(SJson *json,const char *filename, int pretty) { FILE *file; SJString *string; if ((!json) || (!json->get_string))return; - string = json->get_string(json); + string = json->get_string(json,pretty); if (!string)return; file = fopen(filename,"w"); if (!file) @@ -159,11 +159,11 @@ void sj_save(SJson *json,const char *filename) fclose(file); } -void sj_echo(SJson *json) +void sj_echo(SJson *json, int pretty) { SJString *output; if ((!json) || (!json->get_string))return; - output = json->get_string(json); + output = json->get_string(json,pretty); if (!output)return; printf("%s\n",output->text); sj_string_free(output); @@ -175,16 +175,16 @@ void sj_null_free(SJson *json) free(json); } -SJString *sj_value_to_json_string(SJson *json) +SJString *sj_value_to_json_string(SJson *json, int pretty) { if (!json)return NULL; if (!json->get_string)return NULL; - return json->get_string(json); + return json->get_string(json, pretty); } -SJString *sj_null_to_json_string(SJson *json) +SJString *sj_null_to_json_string(SJson *json, int pretty) { - return sj_string_new_text("null",1); + return sj_string_new_text("null",pretty); } SJson *sj_null_copy(SJson *json) diff --git a/src/simple_json_array.c b/src/simple_json_array.c index fa3f2d1..e96cb5f 100644 --- a/src/simple_json_array.c +++ b/src/simple_json_array.c @@ -137,13 +137,14 @@ SJString *sj_array_get_nth_as_string(SJson *array,int n) return item->v.string; } -SJString *sj_array_to_json_string(SJson *array) +SJString *sj_array_to_json_string(SJson *array, int pretty) { SJString *string; SJString *valuestring; SJson *value; int i, count; if (!sj_array_check(array))return NULL; + pretty = pretty ? pretty + 1 : 0; string = sj_string_new_text("[",0); //for each count = sj_list_get_count(array->v.array); @@ -151,10 +152,24 @@ SJString *sj_array_to_json_string(SJson *array) { value = sj_list_get_nth(array->v.array,i); if (!value)continue; - valuestring = sj_value_to_json_string(value); + + valuestring = sj_value_to_json_string(value,pretty); + if(value->sjtype != SJVT_Object && pretty) + { + sj_string_append(string,"\n"); + } + sj_pretty_append_spaces(string,pretty); sj_string_concat(string,valuestring); sj_string_free(valuestring); - if (i +1 < count)sj_string_append(string,","); + if (i + 1 < count) + { + sj_string_append(string,","); + } + } + if(count > 0 && pretty) + { + sj_string_append(string,"\n"); + sj_pretty_append_spaces(string,pretty - 1); } sj_string_append(string,"]"); return string; diff --git a/src/simple_json_object.c b/src/simple_json_object.c index de0b53d..9d68d4f 100644 --- a/src/simple_json_object.c +++ b/src/simple_json_object.c @@ -285,27 +285,60 @@ const char *sj_object_get_value_as_string(SJson *object,const char *key) return sj_string_get_text(value->v.string); } -SJString *sj_object_to_json_string(SJson *object) +void sj_pretty_append_spaces(SJString *object, int pretty) +{ + for(int i = 0; i < (pretty - 1); ++i) + { + sj_string_append(object, " "); + } +} + + +SJString *sj_object_to_json_string(SJson *object, int pretty) { SJString *string; SJString *valuestring; SJPair *pair; int i, count; - string = sj_string_new_text("{",0); + + string = sj_string_new_text("", 0); + if(pretty > 1) + { + sj_string_append(string,"\n"); + sj_pretty_append_spaces(string,pretty); + } + pretty = pretty ? pretty + 1 : 0; + sj_string_append(string, "{"); + //for each count = sj_list_get_count(object->v.array); for (i = 0; i < count; i++) { pair = sj_list_get_nth(object->v.array,i); if (!pair)continue; + if(pretty) + { + sj_string_append(string,"\n"); + sj_pretty_append_spaces(string,pretty); + } sj_string_append(string,"\""); + sj_string_concat(string,pair->key); sj_string_append(string,"\":"); - valuestring = sj_value_to_json_string(pair->value); + valuestring = sj_value_to_json_string(pair->value,pretty); sj_string_concat(string,valuestring); sj_string_free(valuestring); - if (i +1 < count)sj_string_append(string,","); + if (i + 1 < count) + { + sj_string_append(string,","); + } + } + if(count > 0 && pretty) + { + sj_string_append(string,"\n"); + sj_pretty_append_spaces(string,pretty - 1); } + sj_string_append(string,"}"); return string; } diff --git a/src/simple_json_parse.c b/src/simple_json_parse.c index 81a7eb9..a2c180d 100644 --- a/src/simple_json_parse.c +++ b/src/simple_json_parse.c @@ -283,19 +283,35 @@ SJson *sj_parse_buffer(char *string,unsigned long length) { SJson *json = NULL; static jsParse parse; + char *firstBrace; + char *firstBracket; if (!string) { sj_set_error("sj_parse_buffer: no string provided"); return NULL; } parse.buffer = string; - parse.position = strchr(string, '{'); - if (parse.position == NULL) + + firstBrace = strchr(string, '{'); + firstBracket = strchr(string, '['); + if(firstBrace && firstBracket) + { + parse.position = MIN(firstBracket, firstBrace); + } + else if(firstBrace) + { + parse.position = firstBrace; + } + else if(firstBracket) + { + parse.position = firstBracket; + } + else { if (__SJ_DEBUG) sj_set_error("sj_parse_buffer: --=== invalid file ===--"); return NULL; } parse.end = &string[length -1]; - json = sj_parse_object(&parse); + json = (*parse.position == '{') ? sj_parse_object(&parse): sj_parse_array(&parse); return json; } diff --git a/src/simple_json_string.c b/src/simple_json_string.c index d3299fd..dec1e0a 100644 --- a/src/simple_json_string.c +++ b/src/simple_json_string.c @@ -277,7 +277,7 @@ void sj_string_append(SJString *string,const char *buffer) string->size = size; } -SJString *sj_string_to_json_string(SJson *string) +SJString *sj_string_to_json_string(SJson *string, int pretty) { SJString *json; if (!string)return NULL; diff --git a/test/test.c b/test/test.c index 646f23d..a13fc1f 100644 --- a/test/test.c +++ b/test/test.c @@ -20,10 +20,10 @@ int main(int argc, char *argv[]) { printf("json failed to laod:\n%s\n",sj_get_error()); } - sj_echo(json); + sj_echo(json, 1); printf("\nsaving json to file\n"); - sj_save(json,"output.json"); + sj_save(json,"output.json", 1); printf("freeing json structure\n"); sj_free(json); @@ -46,13 +46,13 @@ int main(int argc, char *argv[]) printf("json created:\n"); - sj_echo(json); + sj_echo(json, 0); printf("copying json\n"); sub = sj_copy(json); printf("copied json:\n"); - sj_echo(sub); + sj_echo(sub, 0); sj_free(sub);