int TestSomeFuncs() { int score = 10; // 调用同学们实现的接口 JSON *root = CreateObject(); // 评测1 是否能正确创建Object if (root->type != JSON_OBJECT) { // 类型不对 score -= 2; } AddItemToObject(root, "name", CreateString("Hello World")); // 评测2 是否能正确AddItemToObject并且读取 JSON *value = GetItemInObject(root, "name"); // 类型不对或者值不对 if (value->type != JSON_STRING || strcmp(value->valuestring, "Hello World")) { score -= 2; } JSON *array = CreateArray(); AddItemToArray(array, CreateBool(0)); AddItemToArray(array, CreateNumber(2.3)); // 评测3 是否能正确AddItemToArray并且读取 JSON *item = GetItemInArray(array, 1); if (item->type != JSON_NUMBER || item->valuedouble != 2.3) { score -= 2; } AddItemToObject(root, "array", courses); // 现在root的状态 /* { "name": "Hello Wrold", "array": [ false, 2.3 ] } */ // 评测4 是否能正确地根据路径读取值 item = GetItemInJSON(root, "/array/0"); if (item->type != JSON_FALSE) { score -= 2; } PrintJSONToFile(root, "test.json"); // 评测5 是否与标准答案文件相同 if (!IsSame("test.json", "test.json.ans")) { score -= 2; } return score; }
JSON *Duplicate(JSON *item, int recurse) { JSON *rtn = NULL; JSON *iter = NULL; unsigned int i = 0; if (item == NULL) { printf("Exception: Cannot duplicate a NULL JSON pointer.\n"); return rtn; } switch (item->type) { case JSON_NULL: rtn = CreateNULL(); return rtn; case JSON_FALSE: rtn = CreateFalse(); return rtn; case JSON_TRUE: rtn = CreateTrue(); return rtn; case JSON_NUMBER: rtn = CreateNumber(item->valuedouble); return rtn; case JSON_STRING: rtn = CreateString(item->valuestring); return rtn; case JSON_ARRAY: rtn = CreateArray(); if (recurse == 1) { iter = item->childstart; for (i = 0; i < item->childlength; ++i) { AddItemToArray(rtn, Duplicate(iter, 1)); iter = iter->next; } } else { rtn->childlength = item->childlength; rtn->childstart = item->childstart; rtn->childend = item->childend; } return rtn; case JSON_OBJECT: rtn = CreateObject(); if (recurse == 1) { iter = item->childstart; for (i = 0; i < item->childlength; ++i) { AddItemToObject(rtn, iter->key, Duplicate(iter, 1)); iter = iter->next; } } else { rtn->childlength = item->childlength; rtn->childstart = item->childstart; rtn->childend = item->childend; } return rtn; } }
JSON *array_type_parse(){ JSON *arr_obj = CreateArray(); next_char(); next_non_space_char(); while (str_value() != ']'){ AddItemToArray(arr_obj, non_type_parse()); next_non_space_char(); if (str_value()==','){ next_char(); } } next_char(); return arr_obj; }
JSON *ParseJSON(const char *value) { JSON *rtn = NULL; StrSlice *ss = NULL; StrSlice *iter = NULL; int len = strlen(value); int index = 0; char *value_deletespace = DeleteSpaces(value); switch(value[0]) { case '-': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '0': //To number return CreateNumber(FormatNumber(value_deletespace)); free(value_deletespace); break; case '\"': // To string return CreateString(FormatString(value)); break; case '{': rtn = CreateObject(); ss = GetObjectSlices(value); iter = ss; if (ss->length == 0) { DeleteStrSlice(ss); return rtn; } while (iter != NULL) { AddItemToObject(rtn, FormatString(iter->str), ParseJSON(DeleteSpaces(iter->next->str))); iter = iter->next->next; } DeleteStrSlice(ss); return rtn; break; case '[': rtn = CreateArray(); ss = GetArraySlices(value); iter = ss; if (ss->length == 0) { DeleteStrSlice(ss); return rtn; } while (iter != NULL) { AddItemToArray(rtn, ParseJSON(DeleteSpaces(iter->str))); iter = iter->next; } DeleteStrSlice(ss); return rtn; break; case 'n': if (strcmp(value_deletespace, "null") == 0) { free(value_deletespace); return CreateNULL(); } else { printf("Exception: Invalid Syntax \"%s\"", value); return NULL; } case 't': if (strcmp(value_deletespace, "true") == 0) { free(value_deletespace); return CreateTrue(); } else { printf("Exception: Invalid Syntax \"%s\"", value); return NULL; } break; case 'f': if (strcmp(value_deletespace, "false") == 0) { free(value_deletespace); return CreateFalse(); } else { printf("Exception: Invalid Syntax \"%s\"", value); return NULL; } break; } }