For convenience, there's some helpers function that permits constructing JSON DOM tree. they are built on top of the event based parsing API described earlier.
a DOM parsing context hold the state of the DOM building. it also hold 3 differents callbacks to create the JSON values in the tree.
the first callback, create_structure, is called when a new object or array is suppose to be created. the callback can choose the representation of the data, but need to returns a single void * to represent this new structure.
the second callback, create_data, is called for each value that is not an object or an array. it need returning a void * to represent this value.
the last callback, append, is called each time we need to append a value to an existing structure (array/object). if called with a non-NULL key, then the first argument of the function represent an object, otherwise an array.
the following example hook into a hypothetical framework with array and object special method:
void *tree_create_structure(int nesting, int is_object) { if (is_object) return new_object(); else return new_array(); } void *tree_create_data(int type, const char *data, uint32_t length) { switch (type) { case JSON_STRING: case JSON_INT: case JSON_FLOAT: return new_json_value(type, data, length); case JSON_NULL: case JSON_TRUE: case JSON_FALSE: return new_json_const(type); } } int tree_append(void *structure, char *key, uint32_t key_length, void *obj) { if (key != NULL) { my_object *object = structure; append_object(object, key, key_length, obj); } else { my_array *array = structure; append_array(array, obj); } }
the following example hooks the DOM helper parser into the event parser:
json_parser_dom helper; json_parser parser; json_parser_dom_init(&helper, create_structure, create_data, append); json_parser_init(&parser, json_parser_dom_callback, &helper);