1#ifndef LIBFILEZILLA_JSON_HEADER
2#define LIBFILEZILLA_JSON_HEADER
32class FZ_PUBLIC_SYMBOL json final
35 json()
noexcept =
default;
36 json(json
const&) =
default;
37 json(json &&)
noexcept =
default;
43 return static_cast<json_type>(value_.index());
62 template<
typename T, std::enable_if_t<std::is_
integral_v<
typename std::decay_t<T>>,
int> = 0>
64 auto v = number_value_o<T>();
76 template<
typename T, std::enable_if_t<std::is_
integral_v<
typename std::decay_t<T>>,
int> = 0>
78 bool constexpr is_signed = std::is_signed_v<typename std::decay_t<T>>;
79 if constexpr (is_signed) {
80 std::optional<int64_t> tmp = number_value_integer_s();
82 if (tmp >= std::numeric_limits<T>::min() && tmp <= std::numeric_limits<T>::max()) {
83 return static_cast<T
>(*tmp);
88 std::optional<uint64_t> tmp = number_value_integer_u();
90 if (tmp <= std::numeric_limits<T>::max()) {
91 return static_cast<T
>(*tmp);
100 template<
typename T, std::enable_if_t<std::is_
floating_po
int_v<
typename std::decay_t<T>>,
int> = 0>
102 return static_cast<T
>(number_value_double());
109 void erase(std::string
const& name);
137 template<
typename Bool, std::enable_if_t<std::is_same_v<
bool,
typename std::decay_t<Bool>>,
int> = 0>
144 template<
typename T, std::enable_if_t<std::is_
integral_v<T> && !std::is_same_v<
bool,
typename std::decay_t<T>>,
int> = 0>
146 value_.emplace<std::size_t(json_type::number)>(
fz::to_string(n));
164 explicit operator
bool()
const {
return type() != json_type::none; }
166 bool has_non_null_value()
const {
172 bool is_array()
const {
return type() == fz::json_type::array; }
173 bool is_number()
const {
return type() == fz::json_type::number; }
174 bool is_boolean()
const {
return type() == fz::json_type::boolean; }
181 std::string
to_string(
bool pretty =
false,
size_t depth = 0)
const;
190 void to_string(std::string & ret,
bool pretty =
false,
size_t depth = 0)
const;
196 static json
parse(std::string_view
const& v,
size_t max_depth = 20);
202 void to_string_impl(std::string & ret,
bool pretty =
false,
size_t depth = 0)
const;
204 std::optional<int64_t> number_value_integer_s()
const;
205 std::optional<uint64_t> number_value_integer_u()
const;
206 double number_value_double()
const;
208 bool FZ_PRIVATE_SYMBOL check_type(
json_type t);
209 void FZ_PRIVATE_SYMBOL set_type(
json_type t);
211 static json FZ_PRIVATE_SYMBOL
parse(
char const*& p,
char const* end,
size_t max_depth);
213 typedef std::variant<
216 std::map<std::string, json, std::less<>>,
225template <
bool isconst>
226struct json_array_iterator final {
227 using json_ref_t = std::conditional_t<isconst, json const&, json &>;
231 json_array_iterator(json_ref_t j)
244 json_ref_t operator*()
const
249 bool operator!=(json_array_iterator::sentinel
const&)
const
251 return idx_ < json_.children();
The buffer class is a simple buffer where data can be appended at the end and consumed at the front....
Definition buffer.hpp:27
json parser/builder
Definition json.hpp:33
static json parse(std::string_view const &v, size_t max_depth=20)
Parses JSON structure from input.
json & operator=(T n)
Sets type to number and assigns value.
Definition json.hpp:145
json & operator=(std::string_view const &v)
Sets type to string and assigns value.
std::string to_string(bool pretty=false, size_t depth=0) const
Serializes JSON structure.
json & operator[](size_t i)
Returns reference to the child value with the given index.
std::string string_value() const
Returns string, number and boolean values as string.
json const & operator[](std::string const &name) const
If object, get the value with the given name. Returns none if not object or name doesn't exist.
json & operator=(std::wstring_view const &v)
Sets type to string and assigns value.
Definition json.hpp:157
void erase(std::string const &name)
If object value, deletes child value with given name.
json & operator=(Bool b)
Sets type to boolean and assigns value.
Definition json.hpp:138
size_t children() const
For arrays and objects, returns the number of elements.
T number_value(T errorval={}) const
Returns number and string values as the passed integer type.
Definition json.hpp:63
std::optional< T > number_value_o() const
Returns values as passed integer type if it can be converted, nullopt otherwise.
Definition json.hpp:77
void to_string(std::string &ret, bool pretty=false, size_t depth=0) const
Serializes JSON structure.
json & operator[](std::string const &name)
Returns reference to the child value with the given name.
T number_value() const
Returns number and string values as the passed floating point type.
Definition json.hpp:101
std::wstring wstring_value() const
Returns string, number and boolean values as wstring.
Definition json.hpp:50
json(json_type t)
Explicitly creates a value of a specific type, mainly needed for null objects.
bool bool_value() const
Returns boolean and string values as bool.
json const & operator[](size_t i) const
If array, get the value with the given index. Returns none if not array or index doesn't exist.
type
Definition logger.hpp:16
The namespace used by libfilezilla.
Definition apply.hpp:17
std::wstring to_wstring_from_utf8(std::string_view const &in)
Converts from std::string in UTF-8 into std::wstring.
std::string to_utf8(std::string_view const &in)
Converts from std::string in native encoding into std::string in UTF-8.
std::string to_string(std::wstring_view const &in)
Converts from std::wstring into std::string in system encoding.
json_type
Types of JSON values.
Definition json.hpp:18
@ null
Not a JSON value.
Definition json.hpp:20
@ object
The explicit null value.
Definition json.hpp:21
String types and assorted functions.