diff --git a/bigpoint_dyntype.c b/bigpoint_dyntype.c index d451e9c..c262fa1 100644 --- a/bigpoint_dyntype.c +++ b/bigpoint_dyntype.c @@ -56,6 +56,12 @@ __jsonConst(struct BIGPOINT_DYNTYPE * _this, struct json_object * json) } break; + case json_type_object: + _this->type = BIGPOINT_DYNTYPE_HASH; + _this->size = sizeof(struct BIGPOINT_HASH *); + (_this->data)._hash = newFromJson(BIGPOINT_HASH, json); + break; + default: _this->type = BIGPOINT_DYNTYPE_NULL; _this->size = 0; @@ -73,6 +79,10 @@ __destruct(struct BIGPOINT_DYNTYPE * _this) free((_this->data)._string); break; + case BIGPOINT_DYNTYPE_HASH: + delete((_this->data)._hash); + break; + default: break; } @@ -94,6 +104,10 @@ __toJson(struct BIGPOINT_DYNTYPE * _this) json = json_object_new_string((_this->data)._string); break; + case BIGPOINT_DYNTYPE_HASH: + json = toJson((_this->data)._hash); + break; + default: json = NULL; } diff --git a/bigpoint_hash.c b/bigpoint_hash.c index 49ddaff..254a23a 100644 --- a/bigpoint_hash.c +++ b/bigpoint_hash.c @@ -52,6 +52,17 @@ static struct json_object * __toJson(struct BIGPOINT_HASH * _this) { + size_t index; + struct json_object * json = json_object_new_object(); + + for (index = 0; index < _this->used; index ++) { + json_object_object_add( + json, + _this->keys[index], + toJson(_this->values[index])); + } + + return json; } static const diff --git a/tests/dyntype_test.c b/tests/dyntype_test.c index d9d25a8..64a767f 100644 --- a/tests/dyntype_test.c +++ b/tests/dyntype_test.c @@ -6,6 +6,9 @@ #include "../bigpoint_dyntype.h" #define TEST_STR "this is a foo string" +#define TEST_KEY1 "key1" +#define TEST_KEY2 "key2" +#define TEST_KEY3 "key3" int @@ -43,6 +46,33 @@ main(int argc, char * argv[]) delete(dyn); json_object_put(json); + json = json_tokener_parse("{\"key1\":123,\"key2\":321,\"key3\":\"" TEST_STR "\"}"); + dyn = newFromJson(BIGPOINT_DYNTYPE, json); + json_object_put(json); + + json = toJson(dyn); + printf("%s\n", json_object_to_json_string(json)); + json_object_put(json); + + if (BIGPOINT_DYNTYPE_HASH == dyn->type) { + struct BIGPOINT_HASH * hash = (dyn->data)._hash; + struct BIGPOINT_DYNTYPE * value; + + value = bigpoint_hash_get(hash, TEST_KEY1); + printf("%d\n", (value->data)._int); + delete(value); + + value = bigpoint_hash_get(hash, TEST_KEY2); + printf("%d\n", (value->data)._int); + delete(value); + + value = bigpoint_hash_get(hash, TEST_KEY3); + printf("%s\n", (value->data)._string); + delete(value); + } + + delete(dyn); + return 0; } diff --git a/tests/hash_test.c b/tests/hash_test.c index 71ba5fe..eabf6a4 100644 --- a/tests/hash_test.c +++ b/tests/hash_test.c @@ -3,7 +3,6 @@ #include #include "../bigpoint_cclass.h" -#include "../bigpoint_dyntype.h" #include "../bigpoint_hash.h" @@ -24,6 +23,10 @@ main(int argc, char * argv[]) dyn = new(BIGPOINT_DYNTYPE, BIGPOINT_DYNTYPE_INT, sizeof(int), 321); bigpoint_hash_set(hash, TEST_KEY2, dyn); + json = toJson(hash); + printf("%s\n", json_object_to_json_string(json)); + json_object_put(json); + dyn = bigpoint_hash_get(hash, TEST_KEY1); printf("%d\n", (dyn->data)._int); delete(dyn);