1 /* This file is part of the YAZ toolkit.
2 * Copyright (C) 1995-2010 Index Data.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of Index Data nor the names of its contributors
13 * may be used to endorse or promote products derived from this
14 * software without specific prior written permission.
16 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 \brief Header for JSON functions
34 #include <yaz/wrbuf.h>
38 /** \brief JSON node type for json_node */
40 json_node_object, /**< JSON object, u.link[0] is object content */
41 json_node_array, /**< JSON array, u.link[0] is array content */
42 json_node_list, /**< JSON elements or JSON members,
43 u.link[0] is value, u.link[1] is next elemen in list */
44 json_node_pair, /**< JSON pair, u.link[0] is name, u.link[1] is value */
45 json_node_string, /**< JSON string, u.string is content */
46 json_node_number, /**< JSON number (floating point), u.number is content */
47 json_node_true, /**< JSON true */
48 json_node_false, /**< JSON false */
49 json_node_null /**< JSON null */
52 /** \brief JSON node */
54 enum json_node_type type;
58 struct json_node *link[2];
62 /** \brief JSON parser (opaque) */
63 typedef struct json_parser_s *json_parser_t;
65 /** \brief create JSON parser
66 \returns JSON parser handle
69 json_parser_t json_parser_create(void);
71 /** \brief destroys JSON parser
72 \param p JSON parser handle
75 void json_parser_destroy(json_parser_t p);
77 /** \brief parses JSON string
78 \param p JSON parser handle
79 \param json_str JSON string
80 \returns JSON tree or NULL if parse error occurred.
82 The resulting tree should be removed with a call to json_remove_node.
85 struct json_node *json_parser_parse(json_parser_t p, const char *json_str);
87 /** \brief returns parser error
88 \param p JSON parser handle
89 \returns parse error msg
91 This function should be called if json_parser_parse returns NULL .
94 const char *json_parser_get_errmsg(json_parser_t p);
96 /** \brief parses JSON string
97 \param json_str JSON string
98 \param errmsg pointer to error message string
99 \returns JSON tree or NULL if parse error occurred.
101 The resulting tree should be removed with a call to json_remove_node.
102 The errmsg may be NULL in which case the error message is not returned.
105 struct json_node *json_parse(const char *json_str, const char **errmsg);
107 /** \brief destroys JSON tree node and its children
111 void json_remove_node(struct json_node *n);
113 /** \brief gets object pair value for some name
114 \param n JSON node (presumably object node)
115 \param name name to match
116 \returns node or NULL if not found
119 struct json_node *json_get_object(struct json_node *n, const char *name);
121 /** \brief gets object value and detaches from existing tree
122 \param n JSON node (presumably object node)
123 \param name name to match
124 \returns node or NULL if not found
127 struct json_node *json_detach_object(struct json_node *n, const char *name);
129 /** \brief gets array element
130 \param n JSON node (presumably array node)
131 \param idx (0=first, 1=second, ..)
132 \returns node or NULL if not found
135 struct json_node *json_get_elem(struct json_node *n, int idx);
137 /** \brief returns number of children (array or object)
138 \param n JSON node (presumably array node or object node)
139 \returns number of children
142 int json_count_children(struct json_node *n);
144 /** \brief appends array to another
145 \param dst original array and resulting array
146 \param src array to be appended to dst
147 \retval -1 not arrays
148 \retval 0 array appended OK
151 int json_append_array(struct json_node *dst, struct json_node *src);
153 /** \brief configure subst rule
156 \param n node to be substituted for idx (%idx)
159 void json_parser_subst(json_parser_t p, int idx, struct json_node *n);
161 /** \brief converts JSON tree to JSON string
162 \param node JSON tree
163 \param result resulting JSON string buffer
166 void json_write_wrbuf(struct json_node *node, WRBUF result);
175 * c-file-style: "Stroustrup"
176 * indent-tabs-mode: nil
178 * vim: shiftwidth=4 tabstop=8 expandtab