4 * (c) 2015 Martin Mares <mj@ucw.cz>
6 * This software may be freely distributed and used according to the terms
7 * of the GNU Lesser General Public License.
10 #ifndef _UCW_JSON_JSON_H
11 #define _UCW_JSON_JSON_H
13 #include <ucw/mempool.h>
14 #include <ucw/fastbuf.h>
16 #ifdef CONFIG_UCW_CLEAN_ABI
17 #define json_array_append ucw_json_array_append
18 #define json_delete ucw_json_delete
19 #define json_new ucw_json_new
20 #define json_new_array ucw_json_new_array
21 #define json_new_node ucw_json_new_node
22 #define json_new_object ucw_json_new_object
23 #define json_next_token ucw_json_next_token
24 #define json_next_value ucw_json_next_value
25 #define json_object_get ucw_json_object_get
26 #define json_object_set ucw_json_object_set
27 #define json_parse ucw_json_parse
28 #define json_peek_token ucw_json_peek_token
29 #define json_pop ucw_json_pop
30 #define json_push ucw_json_push
31 #define json_reset ucw_json_reset
32 #define json_set_input ucw_json_set_input
33 #define json_set_output ucw_json_set_output
34 #define json_write ucw_json_write
35 #define json_write_value ucw_json_write_value
39 * === JSON library context
41 * The context structure remembers the whole state of the JSON
42 * library. All JSON values are allocated from a memory pool associated
43 * with the context. By default, their lifetime is the same as that
46 * Alternatively, you can mark the current state of the context
47 * with json_push() and return to the marked state later using
48 * json_pop(). All JSON values created between these two operations
49 * are released afterwards. See json_push() for details.
53 * The context is represented a pointer to this structure.
54 * The fields marked with [*] are publicly accessible, the rest is private.
59 struct mempool_state init_state;
62 struct fastbuf *in_fb;
63 uint in_line; // [*] Current line number
64 uint in_column; // [*] Current column number
65 bool in_eof; // End of file was encountered
66 struct json_node *next_token;
67 struct json_node *trivial_token;
71 struct fastbuf *out_fb;
73 uint format_options; // [*] Formatting options (a combination of JSON_FORMAT_xxx)
76 /** Creates a new JSON context. **/
77 struct json_context *json_new(void);
79 /** Deletes a JSON context, deallocating all memory associated with it. **/
80 void json_delete(struct json_context *js);
83 * Recycles a JSON context. All state is reset, allocated objects are freed.
84 * This is equivalent to mp_delete() followed by mp_new(), but it is faster
85 * and the address of the context is preserved.
87 void json_reset(struct json_context *js);
90 * Push the current state of the context onto state stack.
92 * Between json_push() and the associated json_pop(), only newly
93 * created JSON values can be modified. Older values can be only
94 * inspected, never modified. In particular, new values cannot be
95 * inserted to old arrays nor objects.
97 * If you are using json_peek_token(), the saved tokens cannot
98 * be carried over push/pop boundary.
100 void json_push(struct json_context *js);
103 * Create a copy of a string in JSON memory.
105 * For example, this is useful when you want to use a string of unknown
106 * lifetime as a key in json_object_set().
108 static inline const char *json_strdup(struct json_context *js, const char *str)
110 return mp_strdup(js->pool, str);
114 * Pop state of the context off state stack. All JSON values created
115 * since the state was saved by json_push() are released.
117 void json_pop(struct json_context *js);
122 * Each JSON value is represented by <<struct json_node,struct json_node>>,
123 * which is either an elementary value (null, boolean, number, string),
124 * or a container (array, object) pointing to other values.
126 * A value can belong to multiple containers simultaneously, so in general,
127 * the relationships between values need not form a tree, but a directed
130 * You are allowed to read contents of nodes directly, but construction
131 * and modification of nodes must be always performed using the appropriate
136 enum json_node_type {
144 // These are not real nodes, but raw tokens.
145 // They are not present in the tree of values, but you may see them
146 // if you call json_next_token() and friends.
156 /** Each value is represented by a single node. **/
158 enum json_node_type type;
159 union { // Data specific to individual value types
163 struct json_node **elements; // Arrays: Growing array of values
164 struct json_pair *pairs; // Objects: Growing array of pairs
168 /** Attributes of objects are stored as (key, value) pairs of this format. **/
171 struct json_node *value;
176 struct json_node *json_new_node(struct json_context *js, enum json_node_type type);
178 /** Creates a new null value. **/
179 static inline struct json_node *json_new_null(struct json_context *js UNUSED)
181 static const struct json_node static_null = { .type = JSON_NULL };
182 return (struct json_node *) &static_null;
185 /** Creates a new boolean value. **/
186 static inline struct json_node *json_new_bool(struct json_context *js UNUSED, bool value)
188 static const struct json_node static_bool[2] = {
189 [0] = { .type = JSON_BOOLEAN, .boolean = 0 },
190 [1] = { .type = JSON_BOOLEAN, .boolean = 1 },
192 return (struct json_node *) &static_bool[value];
195 /** Creates a new numeric value. **/
196 static inline struct json_node *json_new_number(struct json_context *js, double value)
198 struct json_node *n = json_new_node(js, JSON_NUMBER);
203 /** Creates a new string value. The @value is kept only as a reference. **/
204 static inline struct json_node *json_new_string_ref(struct json_context *js, const char *value)
206 struct json_node *n = json_new_node(js, JSON_STRING);
211 /** Creates a new string value, making a private copy of @value. **/
212 static inline struct json_node *json_new_string(struct json_context *js, const char *value)
214 return json_new_string_ref(js, mp_strdup(js->pool, value));
217 /** Creates a new array value with no elements. **/
218 struct json_node *json_new_array(struct json_context *js);
220 /** Appends a new element to the given array. **/
221 void json_array_append(struct json_node *array, struct json_node *elt);
223 /** Creates a new object value with no attributes. **/
224 struct json_node *json_new_object(struct json_context *js);
227 * Adds a new (@key, @value) pair to the given object. If @key is already
228 * present, the pair is replaced. If @value is NULL, no new pair is created
229 * and a pre-existing pair is deleted.
231 * The @key is referenced by the object, you must not free it during
232 * the lifetime of the object. When in doubt, use json_strdup().
234 void json_object_set(struct json_node *n, const char *key, struct json_node *value);
236 /** Returns the value associated with @key, or NULL if no such value exists. **/
237 struct json_node *json_object_get(struct json_node *n, const char *key);
242 * The simplest way to parse a complete JSON file is to call json_parse(),
243 * which returns a value tree representing the contents of the file.
245 * Alternatively, you can read the input token by token: call json_set_input()
246 * and then repeat json_next_token(). If you are parsing huge JSON files,
247 * you probably want to do json_push() first, then scan and process some
248 * tokens, and then json_pop().
251 /** Parses a JSON file from the given fastbuf stream. **/
252 struct json_node *json_parse(struct json_context *js, struct fastbuf *fb);
254 /** Selects the given fastbuf stream as parser input. **/
255 void json_set_input(struct json_context *js, struct fastbuf *in);
257 /** Reads the next token from the input. **/
258 struct json_node *json_next_token(struct json_context *js);
260 /** Reads the next token, but keeps it in the input. **/
261 struct json_node *json_peek_token(struct json_context *js);
263 /** Reads the next JSON value, including nested values. **/
264 struct json_node *json_next_value(struct json_context *js);
269 * JSON files can be produced by simply calling json_write().
271 * If you want to generate the output on the fly (for example if it is huge),
272 * call json_set_output() and then iterate json_write_value().
274 * By default, we produce a single-line compact representation,
275 * but you can choose differently by setting the appropriate
276 * `format_options` in the `json_context`.
279 /** Writes a JSON file to the given fastbuf stream, containing the JSON value @n. **/
280 void json_write(struct json_context *js, struct fastbuf *fb, struct json_node *n);
282 /** Selects the given fastbuf stream as output. **/
283 void json_set_output(struct json_context *js, struct fastbuf *fb);
285 /** Writes a single JSON value to the output stream. **/
286 void json_write_value(struct json_context *js, struct json_node *n);
288 /** Formatting options. The `format_options` field in the context is a bitwise OR of these flags. **/
289 enum json_format_option {
290 JSON_FORMAT_ESCAPE_NONASCII = 1, // Produce pure ASCII output by escaping all Unicode characters in strings
291 JSON_FORMAT_INDENT = 2, // Produce pretty indented output