YAJL
2.1.0
|
#include <yajl/yajl_common.h>
Go to the source code of this file.
Data Structures | |
struct | yajl_val_s |
Macros | |
#define | YAJL_NUMBER_INT_VALID 0x01 |
#define | YAJL_NUMBER_DOUBLE_VALID 0x02 |
#define | YAJL_IS_STRING(v) (((v) != NULL) && ((v)->type == yajl_t_string)) |
#define | YAJL_IS_NUMBER(v) (((v) != NULL) && ((v)->type == yajl_t_number)) |
#define | YAJL_IS_INTEGER(v) (YAJL_IS_NUMBER(v) && ((v)->u.number.flags & YAJL_NUMBER_INT_VALID)) |
#define | YAJL_IS_DOUBLE(v) (YAJL_IS_NUMBER(v) && ((v)->u.number.flags & YAJL_NUMBER_DOUBLE_VALID)) |
#define | YAJL_IS_OBJECT(v) (((v) != NULL) && ((v)->type == yajl_t_object)) |
#define | YAJL_IS_ARRAY(v) (((v) != NULL) && ((v)->type == yajl_t_array )) |
#define | YAJL_IS_TRUE(v) (((v) != NULL) && ((v)->type == yajl_t_true )) |
#define | YAJL_IS_FALSE(v) (((v) != NULL) && ((v)->type == yajl_t_false )) |
#define | YAJL_IS_NULL(v) (((v) != NULL) && ((v)->type == yajl_t_null )) |
#define | YAJL_GET_STRING(v) (YAJL_IS_STRING(v) ? (v)->u.string : NULL) |
#define | YAJL_GET_NUMBER(v) ((v)->u.number.r) |
#define | YAJL_GET_DOUBLE(v) ((v)->u.number.d) |
#define | YAJL_GET_INTEGER(v) ((v)->u.number.i) |
#define | YAJL_GET_OBJECT(v) (YAJL_IS_OBJECT(v) ? &(v)->u.object : NULL) |
#define | YAJL_GET_ARRAY(v) (YAJL_IS_ARRAY(v) ? &(v)->u.array : NULL) |
Typedefs | |
typedef struct yajl_val_s * | yajl_val |
Enumerations | |
enum | yajl_type { yajl_t_string = 1, yajl_t_number = 2, yajl_t_object = 3, yajl_t_array = 4, yajl_t_true = 5, yajl_t_false = 6, yajl_t_null = 7, yajl_t_any = 8 } |
Functions | |
YAJL_API yajl_val | yajl_tree_parse (const char *input, char *error_buffer, size_t error_buffer_size) |
YAJL_API void | yajl_tree_free (yajl_val v) |
YAJL_API yajl_val | yajl_tree_get (yajl_val parent, const char **path, yajl_type type) |
Parses JSON data and returns the data in tree form.
This interface makes quick parsing and extraction of smallish JSON docs trivial:
#define YAJL_GET_ARRAY | ( | v | ) | (YAJL_IS_ARRAY(v) ? &(v)->u.array : NULL) |
Get a pointer to a yajl_val_array or NULL if the value is not an object.
#define YAJL_GET_DOUBLE | ( | v | ) | ((v)->u.number.d) |
Get the double representation of a number. You should check type first, perhaps using YAJL_IS_DOUBLE
#define YAJL_GET_INTEGER | ( | v | ) | ((v)->u.number.i) |
Get the 64bit (long long) integer representation of a number. You should check type first, perhaps using YAJL_IS_INTEGER
#define YAJL_GET_NUMBER | ( | v | ) | ((v)->u.number.r) |
Get the string representation of a number. You should check type first, perhaps using YAJL_IS_NUMBER
#define YAJL_GET_OBJECT | ( | v | ) | (YAJL_IS_OBJECT(v) ? &(v)->u.object : NULL) |
Get a pointer to a yajl_val_object or NULL if the value is not an object.
#define YAJL_GET_STRING | ( | v | ) | (YAJL_IS_STRING(v) ? (v)->u.string : NULL) |
Given a yajl_val_string return a ptr to the bare string it contains, or NULL if the value is not a string.
#define YAJL_IS_ARRAY | ( | v | ) | (((v) != NULL) && ((v)->type == yajl_t_array )) |
#define YAJL_IS_DOUBLE | ( | v | ) | (YAJL_IS_NUMBER(v) && ((v)->u.number.flags & YAJL_NUMBER_DOUBLE_VALID)) |
#define YAJL_IS_FALSE | ( | v | ) | (((v) != NULL) && ((v)->type == yajl_t_false )) |
#define YAJL_IS_INTEGER | ( | v | ) | (YAJL_IS_NUMBER(v) && ((v)->u.number.flags & YAJL_NUMBER_INT_VALID)) |
#define YAJL_IS_NULL | ( | v | ) | (((v) != NULL) && ((v)->type == yajl_t_null )) |
#define YAJL_IS_NUMBER | ( | v | ) | (((v) != NULL) && ((v)->type == yajl_t_number)) |
#define YAJL_IS_OBJECT | ( | v | ) | (((v) != NULL) && ((v)->type == yajl_t_object)) |
#define YAJL_IS_STRING | ( | v | ) | (((v) != NULL) && ((v)->type == yajl_t_string)) |
#define YAJL_IS_TRUE | ( | v | ) | (((v) != NULL) && ((v)->type == yajl_t_true )) |
#define YAJL_NUMBER_DOUBLE_VALID 0x02 |
#define YAJL_NUMBER_INT_VALID 0x01 |
typedef struct yajl_val_s* yajl_val |
A pointer to a node in the parse tree
enum yajl_type |
possible data types that a yajl_val_s can hold
Enumerator | |
---|---|
yajl_t_string | |
yajl_t_number | |
yajl_t_object | |
yajl_t_array | |
yajl_t_true | |
yajl_t_false | |
yajl_t_null | |
yajl_t_any |
The any type isn't valid for yajl_val_s.type, but can be used as an argument to routines like yajl_tree_get(). |
Free a parse tree returned by "yajl_tree_parse".
v | Pointer to a JSON value returned by "yajl_tree_parse". Passing NULL is valid and results in a no-op. |
Access a nested value inside a tree.
parent | the node under which you'd like to extract values. |
path | A null terminated array of strings, each the name of an object key |
type | the yajl_type of the object you seek, or yajl_t_any if any will do. |
Future Ideas: it'd be nice to move path to a string and implement support for a teeny tiny micro language here, so you can extract array elements, do things like .first and .last, even .length. Inspiration from JSONPath and css selectors? No it wouldn't be fast, but that's not what this API is about.
YAJL_API yajl_val yajl_tree_parse | ( | const char * | input, |
char * | error_buffer, | ||
size_t | error_buffer_size | ||
) |
Parse a string.
Parses an null-terminated string containing JSON data and returns a pointer to the top-level value (root of the parse tree).
input | Pointer to a null-terminated utf8 string containing JSON data. |
error_buffer | Pointer to a buffer in which an error message will be stored if yajl_tree_parse fails, or NULL . The buffer will be initialized before parsing, so its content will be destroyed even if yajl_tree_parse succeeds. |
error_buffer_size | Size of the memory area pointed to by error_buffer_size. If error_buffer_size is NULL , this argument is ignored. |
NULL
on error. The memory pointed to must be freed using yajl_tree_free. In case of an error, a null terminated message describing the error in more detail is stored in error_buffer if it is not NULL
.