Parse a string and return a non-NULL json_object if a valid JSON value is found. The string does not need to be a JSON object or array; it can also be a string, number or boolean value.
A partial JSON string can be parsed. If the parsing is incomplete, NULL will be returned and json_tokener_get_error() will be return json_tokener_continue. json_tokener_parse_ex() can then be called with additional bytes in str to continue the parsing.
If json_tokener_parse_ex() returns NULL and the error anything other than json_tokener_continue, a fatal error has occurred and parsing must be halted. Then tok object must not be re-used until json_tokener_reset() is called.
When a valid JSON value is parsed, a non-NULL json_object will be returned. Also, json_tokener_get_error() will return json_tokener_success. Be sure to check the type with json_object_is_type() or json_object_get_type() before using the object.
XXX this shouldn't use internal fields: Trailing characters after the parsed value do not automatically cause an error. It is up to the caller to decide whether to treat this as an error or to handle the additional characters, perhaps by parsing another json value starting from that point.
Extra characters can be detected by comparing the tok->char_offset against the length of the last len parameter passed in.
The tokener does not maintain an internal buffer so the caller is responsible for calling json_tokener_parse_ex with an appropriate str parameter starting with the extra characters.
This interface is presently not 64-bit clean due to the int len argument so the function limits the maximum string size to INT32_MAX (2GB). If the function is called with len == -1 then strlen is called to check the string length is less than INT32_MAX (2GB)
Example:
1 json_object *jobj = NULL;
2 const char *mystring = NULL;
4 enum json_tokener_error jerr;
6 mystring = ... // get JSON string, e.g. read from file, etc...
7 stringlen = strlen(mystring);
8 jobj = json_tokener_parse_ex(tok, mystring, stringlen);
9 } while ((jerr = json_tokener_get_error(tok)) == json_tokener_continue);
10 if (jerr != json_tokener_success)
12 fprintf(stderr, "Error: %s\n", json_tokener_error_desc(jerr));
13 // Handle errors, as appropriate for your application.
15 if (tok->char_offset < stringlen) // XXX shouldn't access internal fields
17 // Handle extra characters after parsed object as desired.
18 // e.g. issue an error, parse another object from that point, etc...
20 // Success, use jobj here.
- Parameters
-
tok | a json_tokener previously allocated with json_tokener_new() |
str | an string with any valid JSON expression, or portion of. This does not need to be null terminated. |
len | the length of str |