view cpp/json_util/json_util.hpp @ 630:04dffcdb8e1a

json_util: initial import, closes #776 @1h
author David Demelier <markand@malikania.fr>
date Tue, 20 Mar 2018 13:18:44 +0100
parents
children 337a805b9ce2
line wrap: on
line source

/*
 * json_util.hpp -- utilities for JSON
 *
 * Copyright (c) 2018 David Demelier <markand@malikania.fr>
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

#ifndef JSON_UTIL_HPP
#define JSON_UTIL_HPP

/**
 * \file json_util.hpp
 * \brief Utilities for JSON.
 */

/**
 * \page Json Json
 * \brief Utilities for JSON.
 *
 * ## Export macros
 *
 * You must define `JSON_UTIL_DLL` globally and `JSON_UTIL_BUILDING_DLL` when
 * compiling the library if you want a DLL, alternatively you can provide your
 * own `JSON_UTIL_EXPORT` macro instead.
 */

#include <cstdint>
#include <string>

#include <boost/optional.hpp>

#include <json.hpp>

/**
 * \cond JSON_UTIL_HIDDEN_SYMBOLS
 */

#if !defined(JSON_UTIL_EXPORT)
#   if defined(JSON_UTIL_DLL)
#       if defined(_WIN32)
#           if defined(JSON_UTIL_BUILDING_DLL)
#               define JSON_UTIL_EXPORT __declspec(dllexport)
#           else
#               define JSON_UTIL_EXPORT __declspec(dllimport)
#           endif
#       else
#           define JSON_UTIL_EXPORT
#       endif
#   else
#       define JSON_UTIL_EXPORT
#   endif
#endif

/**
 * \endcond
 */

/**
 * \brief Utilities for JSON.
 */
namespace json_util {

/**
 * Get a JSON value from the given object or array.
 *
 * \param json the JSON object/array
 * \param key the pointer to the object
 * \return the value or boost::none if not found
 */
JSON_UTIL_EXPORT
boost::optional<nlohmann::json> get(const nlohmann::json& json,
                                    const nlohmann::json::json_pointer& key) noexcept;

/**
 * Get a bool or null if not found or invalid.
 *
 * \param json the JSON object/array
 * \param key the pointer to the object
 * \return the value or boost::none if not found or invalid
 */
JSON_UTIL_EXPORT
boost::optional<bool> get_bool(const nlohmann::json& json,
                               const nlohmann::json::json_pointer& key) noexcept;

/**
 * Get a 64 bit signed integer or null if not found or invalid.
 *
 * \param json the JSON object/array
 * \param key the pointer to the object
 * \return the value or boost::none if not found or invalid
 */
JSON_UTIL_EXPORT
boost::optional<std::uint64_t> get_int(const nlohmann::json& json,
                                       const nlohmann::json::json_pointer& key) noexcept;

/**
 * Get a 64 bit unsigned integer or null if not found or invalid.
 *
 * \param json the JSON object/array
 * \param key the pointer to the object
 * \return the value or boost::none if not found or invalid
 */
JSON_UTIL_EXPORT
boost::optional<std::uint64_t> get_uint(const nlohmann::json& json,
                                        const nlohmann::json::json_pointer& key) noexcept;

/**
 * Get a string or null if not found or invalid.
 *
 * \param json the JSON object/array
 * \param key the pointer to the object
 * \return the value or boost::none if not found or invalid
 */
JSON_UTIL_EXPORT
boost::optional<std::string> get_string(const nlohmann::json& json,
                                        const nlohmann::json::json_pointer& key) noexcept;

/**
 * Get an optional bool.
 *
 * If the property is not found, return default value. If the property is not
 * a bool, return boost::none, otherwise return the value.
 *
 * \param json the JSON object/array
 * \param key the pointer to the object
 * \param def the default value
 * \return the value, boost::none or def
 */
JSON_UTIL_EXPORT
boost::optional<bool> optional_bool(const nlohmann::json& json,
                                    const nlohmann::json::json_pointer& key,
                                    bool def = false) noexcept;

/**
 * Get an optional integer.
 *
 * If the property is not found, return default value. If the property is not
 * an integer, return boost::none, otherwise return the value.
 *
 * \param json the JSON object/array
 * \param key the pointer to the object
 * \param def the default value
 * \return the value, boost::none or def
 */
JSON_UTIL_EXPORT
boost::optional<std::int64_t> optional_int(const nlohmann::json& json,
                                           const nlohmann::json::json_pointer& key,
                                           std::int64_t def = 0) noexcept;

/**
 * Get an optional unsigned integer.
 *
 * If the property is not found, return default value. If the property is not
 * an unsigned integer, return boost::none, otherwise return the value.
 *
 * \param json the JSON object/array
 * \param key the pointer to the object
 * \param def the default value
 * \return the value, boost::none or def
 */
JSON_UTIL_EXPORT
boost::optional<std::uint64_t> optional_uint(const nlohmann::json& json,
                                             const nlohmann::json::json_pointer& key,
                                             std::uint64_t def = 0) noexcept;

/**
 * Get an optional string.
 *
 * If the property is not found, return default value. If the property is not
 * a string, return boost::none, otherwise return the value.
 *
 * \param json the JSON object/array
 * \param key the pointer to the object
 * \param def the default value
 * \return the value, boost::none or def
 */
JSON_UTIL_EXPORT
boost::optional<std::string> optional_string(const nlohmann::json& json,
                                             const nlohmann::json::json_pointer& key,
                                             const std::string& def = "") noexcept;

/**
 * Print the value as human readable.
 *
 * \param value the value
 * \return the string
 */
JSON_UTIL_EXPORT
std::string pretty(const nlohmann::json& value);

/**
 * Check if the array contains the given value.
 *
 * \param array the array
 * \param value the JSON value to check
 * \return true if present
 */
JSON_UTIL_EXPORT
bool contains(const nlohmann::json& array, const nlohmann::json& value) noexcept;

} // !irccd

#endif // !JSON_UTIL_HPP