JSON_STATE_ARRAY_VALUE,
JSON_STATE_ARRAY_SKIP_STRING,
JSON_STATE_ARRAY_NEXT,
+ JSON_STATE_ARRAY_NEXT_SKIP,
JSON_STATE_VALUE,
JSON_STATE_DONE
};
/* we skipped over the previous value */
parser->skipping = FALSE;
}
+ case JSON_STATE_ARRAY_NEXT_SKIP:
if (*parser->data == ']')
return json_parse_close_array(parser, type_r);
if (*parser->data != ',') {
i_assert(parser->strinput == NULL);
i_assert(parser->state == JSON_STATE_OBJECT_COLON ||
parser->state == JSON_STATE_OBJECT_VALUE ||
- parser->state == JSON_STATE_ARRAY_VALUE);
+ parser->state == JSON_STATE_ARRAY_VALUE ||
+ parser->state == JSON_STATE_ARRAY_NEXT);
parser->skipping = TRUE;
+ if (parser->state == JSON_STATE_ARRAY_NEXT)
+ parser->state = JSON_STATE_ARRAY_NEXT_SKIP;
}
static void json_strinput_destroyed(struct json_parser *parser)
test_end();
}
+static void test_json_parser_skip_array(void)
+{
+ static const char *test_input =
+ "[ 1, {\"foo\": 1 }, 2, \"bar\", 3, 1.234, 4, [], 5, [[]], 6, true ]";
+ struct json_parser *parser;
+ struct istream *input;
+ enum json_type type;
+ const char *value, *error;
+ int i;
+
+ test_begin("json parser skip array");
+
+ input = test_istream_create_data(test_input, strlen(test_input));
+ parser = json_parser_init_flags(input, JSON_PARSER_NO_ROOT_OBJECT);
+ test_assert(json_parse_next(parser, &type, &value) > 0 &&
+ type == JSON_TYPE_ARRAY);
+ for (i = 1; i <= 6; i++) {
+ test_assert(json_parse_next(parser, &type, &value) > 0 &&
+ type == JSON_TYPE_NUMBER && atoi(value) == i);
+ json_parse_skip_next(parser);
+ }
+ test_assert(json_parse_next(parser, &type, &value) > 0 &&
+ type == JSON_TYPE_ARRAY_END);
+ test_assert(json_parser_deinit(&parser, &error) == 0);
+ i_stream_unref(&input);
+ test_end();
+}
+
static int
test_json_parse_input(const char *test_input, enum json_parser_flags flags)
{
{
test_json_parser_success(TRUE);
test_json_parser_success(FALSE);
+ test_json_parser_skip_array();
test_json_parser_primitive_values();
test_json_parser_errors();
test_json_append_escaped();