-
Notifications
You must be signed in to change notification settings - Fork 165
Description
I am trying to iterate through an array using json_next_elem(). The function returns a handle suitable to be passed to the next invocation, which is a common idiom and the user's expectation is definitely that this handle remembers, where to continue with the next search, and such iteration is thus O(n).
If I try the following code
const char* json = "[1,2,3,4,5]";
void* handle = NULL;
int idx;
struct json_token val;
while ((handle = json_next_elem(json, strlen(json), handle, "", &idx, &val))) {
fprintf(stderr, "idx %d\n", idx);
}
and place a breakpoint at json_parse_value(), the method is in fact called 36 times, with the case '[' being hit 6 times, meaning that the handle in fact only records, what index I want to reach, and searches for it through the whole array, using a simple pointer compare to know where to stop. That makes the function O(n^2) and unusable for anything more than a few elements. In fact we've found the problem trying to parse a file using a simple schema with less than ten thousand elements. which resulted in calling some frozen's functions 73 million times.
I know that I can use json_walk, that is however working around an issue and gets ugly pretty quick.
If this is how the code was intended to work, or there is a way to iterate in a truly linear way, please document it to avoid surprises. If it is not, a fix would be appreciated.
Thanks