123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- /*
- <https://github.com/rafagafe/tiny-json>
-
- Licensed under the MIT License <http://opensource.org/licenses/MIT>.
- SPDX-License-Identifier: MIT
- Copyright (c) 2016-2018 Rafa Garcia <rafagarcia77@gmail.com>.
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
- The above copyright notice and this permission notice shall be included in all
- copies or substantial portions of the Software.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- SOFTWARE.
-
- */
- #ifndef _TINY_JSON_H_
- #define _TINY_JSON_H_
- #ifdef __cplusplus
- extern "C" {
- #endif
- #include <stddef.h>
- #include <stdlib.h>
- #include <stdbool.h>
- #include <stdint.h>
- #define json_containerOf( ptr, type, member ) \
- ((type*)( (char*)ptr - offsetof( type, member ) ))
- /** @defgroup tinyJson Tiny JSON parser.
- * @{ */
- /** Enumeration of codes of supported JSON properties types. */
- typedef enum {
- JSON_OBJ, JSON_ARRAY, JSON_TEXT, JSON_BOOLEAN,
- JSON_INTEGER, JSON_REAL, JSON_NULL
- } jsonType_t;
- /** Structure to handle JSON properties. */
- typedef struct json_s {
- struct json_s* sibling;
- char const* name;
- union {
- char const* value;
- struct {
- struct json_s* child;
- struct json_s* last_child;
- } c;
- } u;
- jsonType_t type;
- } json_t;
- /** Parse a string to get a json.
- * @param str String pointer with a JSON object. It will be modified.
- * @param mem Array of json properties to allocate.
- * @param qty Number of elements of mem.
- * @retval Null pointer if any was wrong in the parse process.
- * @retval If the parser process was successfully a valid handler of a json.
- * This property is always unnamed and its type is JSON_OBJ. */
- json_t const* json_create( char* str, json_t mem[], unsigned int qty );
- /** Get the name of a json property.
- * @param json A valid handler of a json property.
- * @retval Pointer to null-terminated if property has name.
- * @retval Null pointer if the property is unnamed. */
- static inline char const* json_getName( json_t const* json ) {
- return json->name;
- }
- /** Get the value of a json property.
- * The type of property cannot be JSON_OBJ or JSON_ARRAY.
- * @param property A valid handler of a json property.
- * @return Pointer to null-terminated string with the value. */
- static inline char const* json_getValue( json_t const* property ) {
- return property->u.value;
- }
- /** Get the type of a json property.
- * @param json A valid handler of a json property.
- * @return The code of type.*/
- static inline jsonType_t json_getType( json_t const* json ) {
- return json->type;
- }
- /** Get the next sibling of a JSON property that is within a JSON object or array.
- * @param json A valid handler of a json property.
- * @retval The handler of the next sibling if found.
- * @retval Null pointer if the json property is the last one. */
- static inline json_t const* json_getSibling( json_t const* json ) {
- return json->sibling;
- }
- /** Search a property by its name in a JSON object.
- * @param obj A valid handler of a json object. Its type must be JSON_OBJ.
- * @param property The name of property to get.
- * @retval The handler of the json property if found.
- * @retval Null pointer if not found. */
- json_t const* json_getProperty( json_t const* obj, char const* property );
- /** Search a property by its name in a JSON object and return its value.
- * @param obj A valid handler of a json object. Its type must be JSON_OBJ.
- * @param property The name of property to get.
- * @retval If found a pointer to null-terminated string with the value.
- * @retval Null pointer if not found or it is an array or an object. */
- char const* json_getPropertyValue( json_t const* obj, char const* property );
- /** Get the first property of a JSON object or array.
- * @param json A valid handler of a json property.
- * Its type must be JSON_OBJ or JSON_ARRAY.
- * @retval The handler of the first property if there is.
- * @retval Null pointer if the json object has not properties. */
- static inline json_t const* json_getChild( json_t const* json ) {
- return json->u.c.child;
- }
- /** Get the value of a json boolean property.
- * @param property A valid handler of a json object. Its type must be JSON_BOOLEAN.
- * @return The value stdbool. */
- static inline bool json_getBoolean( json_t const* property ) {
- return *property->u.value == 't';
- }
- /** Get the value of a json integer property.
- * @param property A valid handler of a json object. Its type must be JSON_INTEGER.
- * @return The value stdint. */
- static inline int64_t json_getInteger( json_t const* property ) {
- return strtoll( property->u.value,(char**)NULL, 10);
- }
- /** Get the value of a json real property.
- * @param property A valid handler of a json object. Its type must be JSON_REAL.
- * @return The value. */
- static inline double json_getReal( json_t const* property ) {
- return strtod( property->u.value,(char**)NULL );
- }
- /** Structure to handle a heap of JSON properties. */
- typedef struct jsonPool_s jsonPool_t;
- struct jsonPool_s {
- json_t* (*init)( jsonPool_t* pool );
- json_t* (*alloc)( jsonPool_t* pool );
- };
- /** Parse a string to get a json.
- * @param str String pointer with a JSON object. It will be modified.
- * @param pool Custom json pool pointer.
- * @retval Null pointer if any was wrong in the parse process.
- * @retval If the parser process was successfully a valid handler of a json.
- * This property is always unnamed and its type is JSON_OBJ. */
- json_t const* json_createWithPool( char* str, jsonPool_t* pool );
- /** @ } */
- #ifdef __cplusplus
- }
- #endif
- #endif /* _TINY_JSON_H_ */
|