diff --git a/api.c b/api.c
index c05f08684fcb8a29ce8abd91254a7741eb6c5af8..fbc9dea4f44ebf507dc4b1611c94efb25ae87bf6 100644
--- a/api.c
+++ b/api.c
@@ -66,12 +66,87 @@ out:
 	return NULL;
 }
 
+int get_idx(char *key)
+{
+	char *open_brace = strchr(key, '[');
+	printf("open_brace=%s\n", open_brace);
+	if (open_brace) {
+		char *close_brace = strchr(open_brace, ']');
+		if (close_brace) {
+			int len = close_brace - open_brace;
+			printf("len=%d\n", len);
+			char *idx_str = calloc(1, len);
+			strncpy(idx_str, open_brace + 1, len-1);
+			printf("idx_str = %s\n", idx_str);
+			int idx = atoi(idx_str);
+			printf("idx = %d\n", idx);
+			*open_brace = '\0';
+			printf("key=%s\n", key);
+			return idx;
+		}
+	}
+
+	return -2;
+}
+
+int add_array(struct json_object *ptr, int idx, char *val, enum json_type type, char *key)
+{
+	struct json_object *tmp;
+	struct json_object *j_val;
+	printf("%s %d\n", __func__, __LINE__);
+	switch(type) {
+	case json_type_array:
+		j_val = json_tokener_parse(val);
+	break;
+	case json_type_boolean:
+		;;
+	break;
+	case json_type_object:
+		j_val = json_tokener_parse(val);
+	break;
+	case json_type_string:
+		j_val = json_object_new_string(val);
+	break;
+	case json_type_double:
+		j_val = json_object_new_double(atof(val));
+	break;
+	case json_type_int:
+		j_val = json_object_new_double(atoi(val));
+	break;
+	default:
+		return -1;
+	break;
+	}
+printf("%s %d\n", __func__, __LINE__);
+	json_object_object_get_ex(ptr, key, &tmp);
+	if (json_object_is_type(tmp, json_type_array)) {
+		if (tmp && idx != -1) {
+			json_object_array_put_idx(tmp, idx, j_val);
+		} else if (tmp && idx == -1) {
+			printf("%s %d\n", __func__, __LINE__);
+			json_object_array_add(tmp, j_val);
+		}
+	} else {
+		printf("%s %d\n", __func__, __LINE__);
+		tmp = json_object_new_array();
+		json_object_array_add(tmp, j_val);
+		printf("%s %d type=%s, ptr_type=%s\n", __func__, __LINE__, json_type_to_name(json_object_get_type(tmp)), json_type_to_name(json_object_get_type(ptr)));
+		printf("tmp=%s\n", json_object_get_string(tmp));
+		printf("ptr=%s\n", json_object_get_string(ptr));
+		printf("key=%s\n", key);
+		json_object_object_add(ptr, key, tmp);
+	}
+printf("%s %d\n", __func__, __LINE__);
+	return 0;
+}
+
 int set_by_string(char *fmt, struct json_object **src, char *val, enum json_type type)
 {
 	struct json_object *ptr, *tmp, *tar;
 	const char *delimiter = ".";
 	char buffer[1024] = {0};
 	char *p, *prev = fmt;
+	int idx;
 
 	if (!*src) {
 		printf("lets allocate new object\n");
@@ -90,37 +165,29 @@ int set_by_string(char *fmt, struct json_object **src, char *val, enum json_type
 		/* if next key exists, parse prev key, let switch-case add/alter last key */
 		if (p) {
 			json_object_object_get_ex(tmp, prev, &ptr);
-
+			/* if we need to step further and currently marked value isnt an object, we need to overwrite it */
+			if (!json_object_is_type(ptr, json_type_object)) {
+				ptr = json_object_new_object();
+				json_object_object_add(tmp, prev, ptr);
+			}
 			printf("p=%s\n", p);
 
 			/* TODO: if prev contains [x], get idx of x */
-			char *open_brace = strchr(prev, '[');
-			printf("open_brace=%s\n", open_brace);
-			if (open_brace) {
-				char *close_brace = strchr(open_brace, ']');
-				if (close_brace) {
-					int len = close_brace - open_brace;
-					printf("len=%d\n", len);
-					char *idx_str = calloc(1, len);
-					strncpy(idx_str, open_brace + 1, len-1);
-					printf("idx_str = %s\n", idx_str);
-					int idx = atoi(idx_str);
-					printf("idx = %d\n", idx);
-					*open_brace = '\0';
-					printf("prev=%s\n", prev);
+			idx = get_idx(prev);
+			printf("%s %d\n", __func__, __LINE__);
+			/* TODO: make enums for rv of get_idx */
+			if (idx != -2) {
+				if (ptr && json_object_get_type(ptr) == json_type_array) {
 					printf("%s %d\n", __func__, __LINE__);
-					if (ptr && json_object_get_type(ptr) == json_type_array) {
-						printf("%s %d\n", __func__, __LINE__);
-						ptr = json_object_array_get_idx(ptr, idx);
-					} else {
-						ptr = json_object_new_array();
-						printf("%s %d type=%s, ptr_type=%s\n", __func__, __LINE__, json_type_to_name(json_object_get_type(tmp)), json_type_to_name(json_object_get_type(ptr)));
-						printf("tmp=%s\n", json_object_get_string(tmp));
-						printf("ptr=%s\n", json_object_get_string(ptr));
-						printf("prev=%s\n", prev);
-						json_object_object_add(tmp, prev, ptr);
-						//json_object_array_add(tmp, ptr);
-					}
+					ptr = json_object_array_get_idx(ptr, idx);
+				} else {
+					ptr = json_object_new_array();
+					printf("%s %d type=%s, ptr_type=%s\n", __func__, __LINE__, json_type_to_name(json_object_get_type(tmp)), json_type_to_name(json_object_get_type(ptr)));
+					printf("tmp=%s\n", json_object_get_string(tmp));
+					printf("ptr=%s\n", json_object_get_string(ptr));
+					printf("prev=%s\n", prev);
+					json_object_object_add(tmp, prev, ptr);
+					//json_object_array_add(tmp, ptr);
 				}
 			}
 
@@ -158,10 +225,23 @@ int set_by_string(char *fmt, struct json_object **src, char *val, enum json_type
 	}
 	break;
 	case json_type_string:
-		json_object_object_add(ptr, prev, json_object_new_string(val));
+		idx = get_idx(prev);
+		if (idx == -2)
+			json_object_object_add(ptr, prev, json_object_new_string(val));
+		else {
+			printf("%s %d\n", __func__, __LINE__);
+			add_array(ptr, idx, val, type, prev);
+		}
 	break;
 	case json_type_int:
-		json_object_object_add(ptr, prev, json_object_new_int(atoi(val)));
+		printf("%s %d\n", __func__, __LINE__);
+		idx = get_idx(prev);
+		if (idx == -2)
+			json_object_object_add(ptr, prev, json_object_new_int(atoi(val)));
+		else {
+			printf("%s %d\n", __func__, __LINE__);
+			add_array(ptr, idx, val, type, prev);
+		}
 	break;
 	case json_type_array:
 	{
@@ -179,7 +259,14 @@ int set_by_string(char *fmt, struct json_object **src, char *val, enum json_type
 	}
 	break;
 	case json_type_double:
-		json_object_object_add(ptr, prev, json_object_new_int(atof(val)));
+		idx = get_idx(prev);
+		if (idx == -2)
+			json_object_object_add(ptr, prev, json_object_new_int(atof(val)));
+		else {
+			printf("%s %d\n", __func__, __LINE__);
+			add_array(ptr, idx, val, type, prev);
+		}
+		
 	break;
 	case json_type_boolean:
 	{
@@ -252,7 +339,7 @@ struct json_object *get(char *fmt, struct json_object *src)
 
 int main()
 {
-	struct json_object *obj = path_to_obj("/home/jakob/git/json-editor-api/test.json");
+	struct json_object *obj = path_to_obj("/home/jakob/git/json-editor/test.json");
 	struct json_object *ptr;
 
 	printf("%s %d\n", __func__, __LINE__);
@@ -269,7 +356,7 @@ int main()
 
 	printf("%s\n", json_object_get_string(ptr));
 
-	set_by_string("test.apdfgj[1]", &obj, "1", json_type_string);
+	set_by_string("test.apdfgj[0]", &obj, "1", json_type_string);
 
 	printf("%s\n", json_object_get_string(obj));