Mercurial > code
view cpp/json_util/json_util.cpp @ 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 |
line wrap: on
line source
/* * json_util.cpp -- 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. */ #include "json_util.hpp" namespace json_util { boost::optional<nlohmann::json> get(const nlohmann::json& json, const nlohmann::json::json_pointer& key) noexcept { // Unfortunately, there is no find using pointer yet. try { return json.at(key); } catch (...) { return boost::none; } } boost::optional<bool> get_bool(const nlohmann::json& json, const nlohmann::json::json_pointer& key) noexcept { const auto v = get(json, key); if (!v || !v->is_boolean()) return boost::none; return v->get<bool>(); } boost::optional<std::uint64_t> get_int(const nlohmann::json& json, const nlohmann::json::json_pointer& key) noexcept { const auto v = get(json, key); if (!v || !v->is_number_integer()) return boost::none; return v->get<std::uint64_t>(); } boost::optional<std::uint64_t> get_uint(const nlohmann::json& json, const nlohmann::json::json_pointer& key) noexcept { const auto v = get(json, key); if (!v || !v->is_number_unsigned()) return boost::none; return v->get<std::uint64_t>(); } boost::optional<std::string> get_string(const nlohmann::json& json, const nlohmann::json::json_pointer& key) noexcept { const auto v = get(json, key); if (!v || !v->is_string()) return boost::none; return v->get<std::string>(); } boost::optional<bool> optional_bool(const nlohmann::json& json, const nlohmann::json::json_pointer& key, bool def) noexcept { const auto v = get(json, key); if (!v) return def; if (!v->is_boolean()) return boost::none; return v->get<bool>(); } boost::optional<std::int64_t> optional_int(const nlohmann::json& json, const nlohmann::json::json_pointer& key, std::int64_t def) noexcept { const auto v = get(json, key); if (!v) return def; if (!v->is_number_integer()) return boost::none; return v->get<std::int64_t>(); } boost::optional<std::uint64_t> optional_uint(const nlohmann::json& json, const nlohmann::json::json_pointer& key, std::uint64_t def) noexcept { const auto v = get(json, key); if (!v) return def; if (!v->is_number_unsigned()) return boost::none; return v->get<std::uint64_t>(); } boost::optional<std::string> optional_string(const nlohmann::json& json, const nlohmann::json::json_pointer& key, const std::string& def) noexcept { const auto v = get(json, key); if (!v) return def; if (!v->is_string()) return boost::none; return v->get<std::string>(); } std::string pretty(const nlohmann::json& value) { switch (value.type()) { case nlohmann::json::value_t::boolean: return value.get<bool>() ? "true" : "false"; case nlohmann::json::value_t::string: return value.get<std::string>(); default: return value.dump(); } } bool contains(const nlohmann::json& array, const nlohmann::json& value) noexcept { for (const auto &v : array) if (v == value) return true; return false; } } // !json_util