Add print_json function to traverse json tree and print all elements

This commit is contained in:
Abdelrahman Said 2023-07-01 04:42:40 +01:00
parent f8d69310be
commit 2a4d573118
2 changed files with 112 additions and 0 deletions

View File

@ -64,4 +64,6 @@ struct json_collection {
jentity_t *end;
};
void print_json(const jentity_t *entity, u32 indent);
#endif // !JSON_ENTITIES_H

View File

@ -1 +1,111 @@
#include "json_entities.h"
#include "aliases.h"
#include "dstring.h"
#include <stdio.h>
#include <stdlib.h>
void print_json(const jentity_t *entity, u32 indent) {
PERSISTENT i32 indentation = 0;
dstr_t *key = NULL;
const jval_t *value = NULL;
if (entity->type == JENTITY_SINGLE) {
value = &(entity->value);
} else {
key = entity->pair.key;
value = &(entity->pair.value);
}
if (key) {
printf("%*s\"%s\": ", indentation * indent, "", dstr_to_cstr(key));
}
switch (value->type) {
case JVAL_COLLECTION: {
const char *open = "";
const char *close = "";
if (value->collection->type == JCOLL_OBJECT) {
open = "{";
close = "}";
} else {
open = "[";
close = "]";
}
if (key) {
printf("%s\n", open);
} else {
printf("%*s%s\n", indentation * indent, "", open);
}
++indentation;
if (value->collection->begin) {
print_json(value->collection->begin, indent);
}
--indentation;
printf("\n%*s%s", indentation * indent, "", close);
break;
}
case JVAL_STRING:
if (key) {
printf("\"%s\"", dstr_to_cstr(value->string));
} else {
printf("%*s\"%s\"", indentation * indent, "",
dstr_to_cstr(value->string));
}
break;
case JVAL_INTEGER:
if (key) {
printf("%llu", (unsigned long long)value->num_int);
} else {
printf("%*s%llu", indentation * indent, "",
(unsigned long long)value->num_int);
}
break;
case JVAL_DOUBLE:
if (key) {
printf("%f", value->num_dbl);
} else {
printf("%*s%f", indentation * indent, "", value->num_dbl);
}
break;
case JVAL_BOOLEAN:
if (key) {
printf("%s", value->boolean ? "true" : "false");
} else {
printf("%*s%s", indentation * indent, "",
value->boolean ? "true" : "false");
}
break;
case JVAL_NULL:
if (key) {
printf("%s", "null");
} else {
printf("%*s%s", indentation * indent, "", "null");
}
break;
case JVAL_EMPTY:
break;
}
if (entity->next) {
printf(",\n");
print_json(entity->next, indent);
}
// Add newline after printing the entire json tree
if (indentation == 0 && entity->parent == NULL && entity->next == NULL) {
printf("\n");
}
}