Add JSON encoder and decoder
[yaz-moved-to-github.git] / include / yaz / json.h
1 /* This file is part of the YAZ toolkit.
2  * Copyright (C) 1995-2009 Index Data.
3  * All rights reserved.
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are met:
6  *
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.
15  *
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.
26  */
27
28 /** \file json.h
29     \brief Header for JSON functions
30 */
31
32 #ifndef YAZ_JSON_H
33 #define YAZ_JSON_H
34 #include <yaz/wrbuf.h>
35
36 YAZ_BEGIN_CDECL
37
38 /** \brief JSON node type for json_node */
39 enum json_node_type {
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 */
50 };
51
52 /** \brief JSON node */
53 struct json_node {
54     enum json_node_type type;
55     union {
56         char *string; 
57         double number; 
58         struct json_node *link[2];
59     } u;
60 };
61
62 /** \brief JSON parser (opaque) */
63 typedef struct json_parser_s *json_parser_t;
64
65 /** \brief create JSON parser
66     \returns JSON parser handle
67 */
68 YAZ_EXPORT
69 json_parser_t json_parser_create(void);
70
71 /** \brief destroys JSON parser
72     \param p JSON parser handle
73 */
74 YAZ_EXPORT
75 void json_parser_destroy(json_parser_t p);
76
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.
81
82     The resulting tree should be removed with a call to json_remove_node.
83 */
84 YAZ_EXPORT
85 struct json_node *json_parser_parse(json_parser_t p, const char *json_str);
86
87 /** \brief returns parser error
88     \param p JSON parser handle
89     \returns parse error msg 
90
91     This function should be called if json_parser_parse returns NULL .
92 */
93 YAZ_EXPORT
94 const char *json_parser_get_errmsg(json_parser_t p);
95
96 /** \brief destroys JSON tree node and its children
97     \param n JSON node
98 */
99 YAZ_EXPORT
100 void json_remove_node(struct json_node *n);
101
102 /** \brief converts JSON tree to JSON string
103     \param node JSON tree
104     \param result resulting JSON string buffer
105 */
106 YAZ_EXPORT
107 void json_write_wrbuf(struct json_node *node, WRBUF result);
108
109 YAZ_END_CDECL
110
111 #endif
112
113 /*
114  * Local variables:
115  * c-basic-offset: 4
116  * c-file-style: "Stroustrup"
117  * indent-tabs-mode: nil
118  * End:
119  * vim: shiftwidth=4 tabstop=8 expandtab
120  */
121