Closes GH-4.
.. versionadded:: 2.1
+``JSON_DECODE_ANY``
+ By default, the decoder expects that its whole input constitutes a
+ valid JSON array or a valid JSON object. With this flag enabled,
+ the decoder accepts any valid JSON value.
+ This can be incompatible with the JSON_DISABLE_EOF_CHECK flag,
+ because the decoder may read up to 4 extra bytes from the input
+ (one utf-8 encoded character).
+
+ .. versionadded:: 2.3
+
The following functions perform the actual JSON decoding.
.. function:: json_t *json_loads(const char *input, size_t flags, json_error_t *error)
#define JSON_REJECT_DUPLICATES 0x1
#define JSON_DISABLE_EOF_CHECK 0x2
+#define JSON_DECODE_ANY 0x4
json_t *json_loads(const char *input, size_t flags, json_error_t *error);
json_t *json_loadb(const char *buffer, size_t buflen, size_t flags, json_error_t *error);
json_t *result;
lex_scan(lex, error);
- if(lex->token != '[' && lex->token != '{') {
- error_set(error, lex, "'[' or '{' expected");
- return NULL;
+ if(!(flags & JSON_DECODE_ANY)) {
+ if(lex->token != '[' && lex->token != '{') {
+ error_set(error, lex, "'[' or '{' expected");
+ return NULL;
+ }
}
result = parse_value(lex, flags, error);
json_decref(json);
}
+static void decode_any()
+{
+ json_t *json;
+ json_error_t error;
+
+ json = json_loads("\"foo\"", JSON_DECODE_ANY, &error);
+ if (!json || !json_is_string(json))
+ fail("json_load decoded any failed - string");
+ json_decref(json);
+
+ json = json_loads("42", JSON_DECODE_ANY, &error);
+ if (!json || !json_is_integer(json))
+ fail("json_load decoded any failed - integer");
+ json_decref(json);
+
+ json = json_loads("true", JSON_DECODE_ANY, &error);
+ if (!json || !json_is_true(json))
+ fail("json_load decoded any failed - boolean");
+ json_decref(json);
+
+ json = json_loads("null", JSON_DECODE_ANY, &error);
+ if (!json || !json_is_null(json))
+ fail("json_load decoded any failed - null");
+ json_decref(json);
+}
+
static void run_tests()
{
file_not_found();
reject_duplicates();
disable_eof_check();
+ decode_any();
}