瀏覽代碼

Fixed find_json_token() for nested arrays/objects, thanks to Jesse for the fix

Sergey Lyubka 11 年之前
父節點
當前提交
4f5e0575b6
共有 2 個文件被更改,包括 27 次插入3 次删除
  1. 3 3
      frozen.c
  2. 24 0
      unit_test.c

+ 3 - 3
frozen.c

@@ -306,9 +306,9 @@ const struct json_token *find_json_token(const struct json_token *toks,
         i += skip - 1;
         break;
       };
-      if (toks[i + 1].type == JSON_TYPE_ARRAY ||
-          toks[i + 1].type == JSON_TYPE_OBJECT) {
-        i += toks[i + 1].num_desc;
+      if (toks[i - 1 + skip].type == JSON_TYPE_ARRAY ||
+          toks[i - 1 + skip].type == JSON_TYPE_OBJECT) {
+        i += toks[i - 1 + skip].num_desc;
       }
     }
     if (i == toks[-1].num_desc) return 0;

+ 24 - 0
unit_test.c

@@ -218,12 +218,36 @@ static const char *test_emit(void) {
   return NULL;
 }
 
+static const char *test_nested(void) {
+  struct json_token ar[100];
+  const char *s = "{ a : [ [1, 2, { b : 2 } ] ] }";
+  enum json_type types[] = {
+    JSON_TYPE_OBJECT, JSON_TYPE_STRING, JSON_TYPE_ARRAY, JSON_TYPE_ARRAY,
+    JSON_TYPE_NUMBER, JSON_TYPE_NUMBER, JSON_TYPE_OBJECT, JSON_TYPE_STRING,
+    JSON_TYPE_NUMBER, JSON_TYPE_EOF
+  };
+  int i, ar_size = ARRAY_SIZE(ar), types_size = ARRAY_SIZE(types);
+
+  ASSERT(parse_json(s, strlen(s), ar, ar_size) == (int) strlen(s));
+  for (i = 0; i < types_size; i++) {
+    ASSERT(ar[i].type == types[i]);
+  }
+  ASSERT(find_json_token(ar, "a[0]") == &ar[3]);
+  ASSERT(find_json_token(ar, "a[0][0]") == &ar[4]);
+  ASSERT(find_json_token(ar, "a[0][1]") == &ar[5]);
+  ASSERT(find_json_token(ar, "a[0][2]") == &ar[6]);
+  ASSERT(find_json_token(ar, "a[0][2].b") == &ar[8]);
+
+  return NULL;
+}
+
 static const char *run_all_tests(void) {
   RUN_TEST(test_errors);
   RUN_TEST(test_config);
   RUN_TEST(test_emit);
   RUN_TEST(test_emit_escapes);
   RUN_TEST(test_emit_overflow);
+  RUN_TEST(test_nested);
   return NULL;
 }