VirtualBox

source: vbox/trunk/include/iprt/json.h@ 93115

Last change on this file since 93115 was 93115, checked in by vboxsync, 3 years ago

scm --update-copyright-year

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 13.9 KB
Line 
1/** @file
2 * IPRT - JavaScript Object Notation (JSON) Parser.
3 */
4
5/*
6 * Copyright (C) 2016-2022 Oracle Corporation
7 *
8 * This file is part of VirtualBox Open Source Edition (OSE), as
9 * available from http://www.virtualbox.org. This file is free software;
10 * you can redistribute it and/or modify it under the terms of the GNU
11 * General Public License (GPL) as published by the Free Software
12 * Foundation, in version 2 as it comes in the "COPYING" file of the
13 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
14 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
15 *
16 * The contents of this file may alternatively be used under the terms
17 * of the Common Development and Distribution License Version 1.0
18 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
19 * VirtualBox OSE distribution, in which case the provisions of the
20 * CDDL are applicable instead of those of the GPL.
21 *
22 * You may elect to license modified versions of this file under the
23 * terms and conditions of either the GPL or the CDDL or both.
24 */
25
26#ifndef IPRT_INCLUDED_json_h
27#define IPRT_INCLUDED_json_h
28#ifndef RT_WITHOUT_PRAGMA_ONCE
29# pragma once
30#endif
31
32#include <iprt/types.h>
33
34RT_C_DECLS_BEGIN
35
36
37/** @defgroup grp_json RTJson - JavaScript Object Notation (JSON) Parser
38 * @ingroup grp_rt
39 * @{
40 */
41
42/**
43 * JSON value types.
44 */
45typedef enum RTJSONVALTYPE
46{
47 /** Invalid first value. */
48 RTJSONVALTYPE_INVALID = 0,
49 /** Value containing an object. */
50 RTJSONVALTYPE_OBJECT,
51 /** Value containing an array. */
52 RTJSONVALTYPE_ARRAY,
53 /** Value containing a string. */
54 RTJSONVALTYPE_STRING,
55 /** Value containg an integer number. */
56 RTJSONVALTYPE_INTEGER,
57 /** Value containg an floating point number. */
58 RTJSONVALTYPE_NUMBER,
59 /** Value containg the special null value. */
60 RTJSONVALTYPE_NULL,
61 /** Value containing true. */
62 RTJSONVALTYPE_TRUE,
63 /** Value containing false. */
64 RTJSONVALTYPE_FALSE,
65 /** 32-bit hack. */
66 RTJSONVALTYPE_32BIT_HACK = 0x7fffffff
67} RTJSONVALTYPE;
68/** Pointer to a JSON value type. */
69typedef RTJSONVALTYPE *PRTJSONVALTYPE;
70
71/** JSON value handle. */
72typedef struct RTJSONVALINT *RTJSONVAL;
73/** Pointer to a JSON value handle. */
74typedef RTJSONVAL *PRTJSONVAL;
75/** NIL JSON value handle. */
76#define NIL_RTJSONVAL ((RTJSONVAL)~(uintptr_t)0)
77
78/** JSON iterator handle. */
79typedef struct RTJSONITINT *RTJSONIT;
80/** Pointer to a JSON iterator handle. */
81typedef RTJSONIT *PRTJSONIT;
82/** NIL JSON iterator handle. */
83#define NIL_RTJSONIT ((RTJSONIT)~(uintptr_t)0)
84
85/**
86 * Parses a JSON document in the provided buffer returning the root JSON value.
87 *
88 * @returns IPRT status code.
89 * @retval VERR_JSON_MALFORMED if the document does not conform to the spec.
90 * @param phJsonVal Where to store the handle to the JSON value on success.
91 * @param pbBuf The byte buffer containing the JSON document.
92 * @param cbBuf Size of the buffer.
93 * @param pErrInfo Where to store extended error info. Optional.
94 *
95 * @todo r=bird: The use of uint8_t makes no sense here since the parser
96 * expects ASCII / UTF-8. What's more, if this is a real buffer the
97 * type should be 'const void *' rather than 'const uint8_t *'.
98 * This function should be modified to reflect that it's really for
99 * handling unterminated strings.
100 */
101RTDECL(int) RTJsonParseFromBuf(PRTJSONVAL phJsonVal, const uint8_t *pbBuf, size_t cbBuf, PRTERRINFO pErrInfo);
102
103/**
104 * Parses a JSON document from the provided string returning the root JSON value.
105 *
106 * @returns IPRT status code.
107 * @retval VERR_JSON_MALFORMED if the document does not conform to the spec.
108 * @param phJsonVal Where to store the handle to the JSON value on success.
109 * @param pszStr The string containing the JSON document.
110 * @param pErrInfo Where to store extended error info. Optional.
111 */
112RTDECL(int) RTJsonParseFromString(PRTJSONVAL phJsonVal, const char *pszStr, PRTERRINFO pErrInfo);
113
114/**
115 * Parses a JSON document from the file pointed to by the given filename
116 * returning the root JSON value.
117 *
118 * @returns IPRT status code.
119 * @retval VERR_JSON_MALFORMED if the document does not conform to the spec.
120 * @param phJsonVal Where to store the handle to the JSON value on success.
121 * @param pszFilename The name of the file containing the JSON document.
122 * @param pErrInfo Where to store extended error info. Optional.
123 */
124RTDECL(int) RTJsonParseFromFile(PRTJSONVAL phJsonVal, const char *pszFilename, PRTERRINFO pErrInfo);
125
126/**
127 * Parses a JSON document from the given VFS file
128 * returning the root JSON value.
129 *
130 * @returns IPRT status code.
131 * @retval VERR_JSON_MALFORMED if the document does not conform to the spec.
132 * @param phJsonVal Where to store the handle to the JSON value on success.
133 * @param hVfsFile The VFS file to parse.
134 * @param pErrInfo Where to store extended error info. Optional.
135 */
136RTDECL(int) RTJsonParseFromVfsFile(PRTJSONVAL phJsonVal, RTVFSFILE hVfsFile, PRTERRINFO pErrInfo);
137
138/**
139 * Retain a given JSON value.
140 *
141 * @returns New reference count.
142 * @param hJsonVal The JSON value handle.
143 */
144RTDECL(uint32_t) RTJsonValueRetain(RTJSONVAL hJsonVal);
145
146/**
147 * Release a given JSON value.
148 *
149 * @returns New reference count, if this drops to 0 the value is freed.
150 * @param hJsonVal The JSON value handle.
151 */
152RTDECL(uint32_t) RTJsonValueRelease(RTJSONVAL hJsonVal);
153
154/**
155 * Return the type of a given JSON value.
156 *
157 * @returns Type of the given JSON value.
158 * @param hJsonVal The JSON value handle.
159 */
160RTDECL(RTJSONVALTYPE) RTJsonValueGetType(RTJSONVAL hJsonVal);
161
162/**
163 * Translates value type to a name.
164 *
165 * @returns Readonly name string
166 * @param enmType The JSON value type to name.
167 */
168RTDECL(const char *) RTJsonValueTypeName(RTJSONVALTYPE enmType);
169
170/**
171 * Returns the string from a given JSON string value.
172 *
173 * @returns Pointer to the string of the JSON value, NULL if the value type
174 * doesn't indicate a string.
175 * @param hJsonVal The JSON value handle.
176 */
177RTDECL(const char *) RTJsonValueGetString(RTJSONVAL hJsonVal);
178
179/**
180 * Returns the string from a given JSON string value, extended.
181 *
182 * @returns IPRT status code.
183 * @retval VERR_JSON_VALUE_INVALID_TYPE if the JSON value is not a string.
184 * @param hJsonVal The JSON value handle.
185 * @param ppszStr Where to store the pointer to the string on success.
186 */
187RTDECL(int) RTJsonValueQueryString(RTJSONVAL hJsonVal, const char **ppszStr);
188
189/**
190 * Returns the integer from a given JSON integer value.
191 *
192 * @returns IPRT status code.
193 * @retval VERR_JSON_VALUE_INVALID_TYPE if the JSON value is not a number.
194 * @param hJsonVal The JSON value handle.
195 * @param pi64Num WHere to store the number on success.
196 * @sa RTJsonValueQueryNumber
197 */
198RTDECL(int) RTJsonValueQueryInteger(RTJSONVAL hJsonVal, int64_t *pi64Num);
199
200/**
201 * Returns the floating point value from a given JSON number value.
202 *
203 * @returns IPRT status code.
204 * @retval VERR_JSON_VALUE_INVALID_TYPE if the JSON value is not a number.
205 * @param hJsonVal The JSON value handle.
206 * @param prdNum WHere to store the floating point number on success.
207 * @sa RTJsonValueQueryInteger
208 */
209RTDECL(int) RTJsonValueQueryNumber(RTJSONVAL hJsonVal, double *prdNum);
210
211/**
212 * Returns the value associated with a given name for the given JSON object value.
213 *
214 * @returns IPRT status code.
215 * @retval VERR_JSON_VALUE_INVALID_TYPE if the JSON value is not an object.
216 * @retval VERR_NOT_FOUND if the name is not known for this JSON object.
217 * @param hJsonVal The JSON value handle.
218 * @param pszName The member name of the object.
219 * @param phJsonVal Where to store the handle to the JSON value on success.
220 */
221RTDECL(int) RTJsonValueQueryByName(RTJSONVAL hJsonVal, const char *pszName, PRTJSONVAL phJsonVal);
222
223/**
224 * Returns the number of a number value associated with a given name for the given JSON object value.
225 *
226 * @returns IPRT status code.
227 * @retval VERR_JSON_VALUE_INVALID_TYPE if the JSON value is not an object or
228 * the name does not point to an integer value.
229 * @retval VERR_NOT_FOUND if the name is not known for this JSON object.
230 * @param hJsonVal The JSON value handle.
231 * @param pszName The member name of the object.
232 * @param pi64Num Where to store the number on success.
233 */
234RTDECL(int) RTJsonValueQueryIntegerByName(RTJSONVAL hJsonVal, const char *pszName, int64_t *pi64Num);
235
236/**
237 * Returns the number of a number value associated with a given name for the given JSON object value.
238 *
239 * @returns IPRT status code.
240 * @retval VERR_JSON_VALUE_INVALID_TYPE if the JSON value is not an object or
241 * the name does not point to a number value.
242 * @retval VERR_NOT_FOUND if the name is not known for this JSON object.
243 * @param hJsonVal The JSON value handle.
244 * @param pszName The member name of the object.
245 * @param prdNum WHere to store the floating point number on success.
246 */
247RTDECL(int) RTJsonValueQueryNumberByName(RTJSONVAL hJsonVal, const char *pszName, double *prdNum);
248
249/**
250 * Returns the string of a string value associated with a given name for the given JSON object value.
251 *
252 * @returns IPRT status code.
253 * @retval VERR_JSON_VALUE_INVALID_TYPE if the JSON value is not an object or
254 * the name does not point to a string value.
255 * @retval VERR_NOT_FOUND if the name is not known for this JSON object.
256 * @param hJsonVal The JSON value handle.
257 * @param pszName The member name of the object.
258 * @param ppszStr Where to store the pointer to the string on success.
259 * Must be freed with RTStrFree().
260 */
261RTDECL(int) RTJsonValueQueryStringByName(RTJSONVAL hJsonVal, const char *pszName, char **ppszStr);
262
263/**
264 * Returns the boolean of a true/false value associated with a given name for the given JSON object value.
265 *
266 * @returns IPRT status code.
267 * @retval VERR_JSON_VALUE_INVALID_TYPE if the JSON value is not an object or
268 * the name does not point to a true/false value.
269 * @retval VERR_NOT_FOUND if the name is not known for this JSON object.
270 * @param hJsonVal The JSON value handle.
271 * @param pszName The member name of the object.
272 * @param pfBoolean Where to store the boolean value on success.
273 */
274RTDECL(int) RTJsonValueQueryBooleanByName(RTJSONVAL hJsonVal, const char *pszName, bool *pfBoolean);
275
276/**
277 * Returns the size of a given JSON array value.
278 *
279 * @returns Size of the JSON array value.
280 * @retval 0 if the array is empty or the JSON value is not an array.
281 * @param hJsonVal The JSON value handle.
282 */
283RTDECL(unsigned) RTJsonValueGetArraySize(RTJSONVAL hJsonVal);
284
285/**
286 * Returns the size of a given JSON array value - extended version.
287 *
288 * @returns IPRT status code.
289 * @retval VERR_JSON_VALUE_INVALID_TYPE if the JSON value is not an array.
290 * @param hJsonVal The JSON value handle.
291 * @param pcItems Where to store the size of the JSON array value on success.
292 */
293RTDECL(int) RTJsonValueQueryArraySize(RTJSONVAL hJsonVal, unsigned *pcItems);
294
295/**
296 * Returns the value for the given index of a given JSON array value.
297 *
298 * @returns IPRT status code.
299 * @retval VERR_JSON_VALUE_INVALID_TYPE if the JSON value is not an array.
300 * @retval VERR_OUT_OF_RANGE if @a idx is out of bounds.
301 *
302 * @param hJsonVal The JSON value handle.
303 * @param idx The index to get the value from.
304 * @param phJsonVal Where to store the handle to the JSON value on success.
305 */
306RTDECL(int) RTJsonValueQueryByIndex(RTJSONVAL hJsonVal, unsigned idx, PRTJSONVAL phJsonVal);
307
308/**
309 * Creates an iterator for a given JSON array or object value.
310 *
311 * @returns IPRT status code.
312 * @retval VERR_JSON_VALUE_INVALID_TYPE if the JSON value is not an array or
313 * object.
314 * @param hJsonVal The JSON value handle.
315 * @param phJsonIt Where to store the JSON iterator handle on success.
316 * @todo Make return VERR_JSON_IS_EMPTY (or remove it).
317 */
318RTDECL(int) RTJsonIteratorBegin(RTJSONVAL hJsonVal, PRTJSONIT phJsonIt);
319
320/**
321 * Creates an iterator for a given JSON array value.
322 *
323 * @returns IPRT status code.
324 * @retval VERR_JSON_VALUE_INVALID_TYPE if the JSON value is not an array.
325 * @retval VERR_JSON_IS_EMPTY if no members.
326 * @param hJsonVal The JSON value handle.
327 * @param phJsonIt Where to store the JSON iterator handle on success.
328 */
329RTDECL(int) RTJsonIteratorBeginArray(RTJSONVAL hJsonVal, PRTJSONIT phJsonIt);
330
331/**
332 * Creates an iterator for a given JSON object value.
333 *
334 * @returns IPRT status code.
335 * @retval VERR_JSON_VALUE_INVALID_TYPE if the JSON value is not an object.
336 * @retval VERR_JSON_IS_EMPTY if no members.
337 * @param hJsonVal The JSON value handle.
338 * @param phJsonIt Where to store the JSON iterator handle on success.
339 */
340RTDECL(int) RTJsonIteratorBeginObject(RTJSONVAL hJsonVal, PRTJSONIT phJsonIt);
341
342/**
343 * Gets the value and optional name for the current iterator position.
344 *
345 * @returns IPRT status code.
346 * @param hJsonIt The JSON iterator handle.
347 * @param phJsonVal Where to store the handle to the JSON value on success.
348 * @param ppszName Where to store the object member name for an object.
349 * NULL is returned for arrays.
350 */
351RTDECL(int) RTJsonIteratorQueryValue(RTJSONIT hJsonIt, PRTJSONVAL phJsonVal, const char **ppszName);
352
353/**
354 * Advances to the next element in the referenced JSON value.
355 *
356 * @returns IPRT status code.
357 * @retval VERR_JSON_ITERATOR_END if the end for this iterator was reached.
358 * @param hJsonIt The JSON iterator handle.
359 */
360RTDECL(int) RTJsonIteratorNext(RTJSONIT hJsonIt);
361
362/**
363 * Frees a given JSON iterator.
364 *
365 * @param hJsonIt The JSON iterator to free.
366 */
367RTDECL(void) RTJsonIteratorFree(RTJSONIT hJsonIt);
368
369RT_C_DECLS_END
370
371/** @} */
372
373#endif /* !IPRT_INCLUDED_json_h */
374
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette