diff --git a/libutils/json.c b/libutils/json.c index 8a02fc14..7df32a23 100644 --- a/libutils/json.c +++ b/libutils/json.c @@ -76,6 +76,20 @@ struct JsonElement_ // JsonElement Functions // ******************************************************************************************* +const char *JsonGetTypeAsString(const JsonElement *element) +{ + switch (JsonGetElementType(element)) + { + case JSON_ELEMENT_TYPE_CONTAINER: + return JsonContainerTypeToString(JsonGetContainerType(element)); + case JSON_ELEMENT_TYPE_PRIMITIVE: + return JsonPrimitiveTypeToString(JsonGetPrimitiveType(element)); + default: + UnexpectedError("Unknown JSON container type: %d", JsonGetType(element)); + return "(null)"; + } +} + const char *JsonContainerTypeToString(const JsonContainerType type) { switch (type) @@ -101,6 +115,8 @@ const char *JsonPrimitiveTypeToString(const JsonPrimitiveType type) return "number"; case JSON_PRIMITIVE_TYPE_BOOL: return "boolean"; + case JSON_PRIMITIVE_TYPE_NULL: + return "null"; default: UnexpectedError("Unknown JSON primitive type: %d", type); return "(null)"; diff --git a/libutils/json.h b/libutils/json.h index 6e182e4b..e42d7fa0 100644 --- a/libutils/json.h +++ b/libutils/json.h @@ -233,6 +233,8 @@ const char *JsonGetPropertyAsString(const JsonElement *element); #define NULL_JSON(json) ((json == NULL) || (JsonGetType(json) == JSON_TYPE_NULL)) #define JSON_NOT_NULL(json) ((json != NULL) && (JsonGetType(json) != JSON_TYPE_NULL)) +const char *JsonGetTypeAsString(const JsonElement *element); + ////////////////////////////////////////////////////////////////////////////// // JSON Primitives ////////////////////////////////////////////////////////////////////////////// diff --git a/tests/unit/json_test.c b/tests/unit/json_test.c index 4dd192fc..eb129c3c 100644 --- a/tests/unit/json_test.c +++ b/tests/unit/json_test.c @@ -2363,6 +2363,64 @@ static void test_json_object_merge_deep() )); } +static void test_json_get_type_as_string() +{ + { + JsonElement *element = JsonStringCreate("foo"); + const char *expected = "string"; + const char *actual = JsonGetTypeAsString(element); + assert_string_equal(expected, actual); + JsonDestroy(element); + } + + { + JsonElement *element = JsonIntegerCreate(42); + const char *expected = "number"; + const char *actual = JsonGetTypeAsString(element); + assert_string_equal(expected, actual); + JsonDestroy(element); + } + + { + JsonElement *element = JsonRealCreate(3.14); + const char *expected = "number"; + const char *actual = JsonGetTypeAsString(element); + assert_string_equal(expected, actual); + JsonDestroy(element); + } + + { + JsonElement *element = JsonBoolCreate(true); + const char *expected = "boolean"; + const char *actual = JsonGetTypeAsString(element); + assert_string_equal(expected, actual); + JsonDestroy(element); + } + + { + JsonElement *element = JsonNullCreate(true); + const char *expected = "null"; + const char *actual = JsonGetTypeAsString(element); + assert_string_equal(expected, actual); + JsonDestroy(element); + } + + { + JsonElement *element = JsonObjectCreate(0); + const char *expected = "object"; + const char *actual = JsonGetTypeAsString(element); + assert_string_equal(expected, actual); + JsonDestroy(element); + } + + { + JsonElement *element = JsonArrayCreate(0); + const char *expected = "array"; + const char *actual = JsonGetTypeAsString(element); + assert_string_equal(expected, actual); + JsonDestroy(element); + } +} int main() { @@ -2435,6 +2493,7 @@ int main() unit_test(test_json_null_not_null), unit_test(test_json_object_merge_deep), unit_test(test_compare_container_type_mismatch), + unit_test(test_json_get_type_as_string), }; return run_tests(tests);