nlohmann::basic_json::value¶
// (1)
template<class ValueType>
ValueType value(const typename object_t::key_type& key,
ValueType&& default_value) const;
// (2)
template<class ValueType, class KeyType>
ValueType value(KeyType&& key,
ValueType&& default_value) const;
// (3)
template<class ValueType>
ValueType value(const json_pointer& ptr,
const ValueType& default_value) const;
-
Returns either a copy of an object's element at the specified key
key
or a given default value if no element with keykey
exists.The function is basically equivalent to executing
try { return at(key); } catch(out_of_range) { return default_value; }
-
See 1. This overload is only available if
KeyType
is comparable withtypename object_t::key_type
andtypename object_comparator_t::is_transparent
denotes a type. -
Returns either a copy of an object's element at the specified JSON pointer
ptr
or a given default value if no value atptr
exists.The function is basically equivalent to executing
try { return at(ptr); } catch(out_of_range) { return default_value; }
Differences to at
and operator[]
- Unlike
at
, this function does not throw if the givenkey
/ptr
was not found. - Unlike
operator[]
, this function does not implicitly add an element to the position defined bykey
/ptr
key. This function is furthermore also applicable to const objects.
Template parameters¶
KeyType
- A type for an object key other than
json_pointer
that is comparable withstring_t
usingobject_comparator_t
. This can also be a string view (C++17). ValueType
- type compatible to JSON values, for instance
int
for JSON integer numbers,bool
for JSON booleans, orstd::vector
types for JSON arrays. Note the type of the expected value atkey
/ptr
and the default valuedefault_value
must be compatible.
Parameters¶
key
(in)- key of the element to access
default_value
(in)- the value to return if
key
/ptr
found no value ptr
(in)- a JSON pointer to the element to access
Return value¶
- copy of the element at key
key
ordefault_value
ifkey
is not found - copy of the element at key
key
ordefault_value
ifkey
is not found - copy of the element at JSON Pointer
ptr
ordefault_value
if no value forptr
is found
Exception safety¶
Strong guarantee: if an exception is thrown, there are no changes to any JSON value.
Exceptions¶
- The function can throw the following exceptions:
- Throws
type_error.302
ifdefault_value
does not match the type of the value atkey
- Throws
type_error.306
if the JSON value is not an object; in that case, usingvalue()
with a key makes no sense.
- Throws
- See 1.
- The function can throw the following exceptions:
- Throws
type_error.302
ifdefault_value
does not match the type of the value atptr
- Throws
type_error.306
if the JSON value is not an object; in that case, usingvalue()
with a key makes no sense.
- Throws
Complexity¶
- Logarithmic in the size of the container.
- Logarithmic in the size of the container.
- Logarithmic in the size of the container.
Notes¶
Return type
The value function is a template, and the return type of the function is determined by the type of the provided default value unless otherwise specified. This can have unexpected effects. In the example below, we store a 64-bit unsigned integer. We get exactly that value when using operator[]
. However, when we call value
and provide 0
as default value, then -1
is returned. The occurs, because 0
has type int
which overflows when handling the value 18446744073709551615
.
To address this issue, either provide a correctly typed default value or use the template parameter to specify the desired return type. Note that this issue occurs even when a value is stored at the provided key, and the default value is not used as the return value.
#include <iostream>
#include <nlohmann/json.hpp>
using json = nlohmann::json;
int main()
{
json j = json::parse(R"({"uint64": 18446744073709551615})");
std::cout << "operator[]: " << j["uint64"] << '\n'
<< "default value (int): " << j.value("uint64", 0) << '\n'
<< "default value (uint64_t): " << j.value("uint64", std::uint64_t(0)) << '\n'
<< "explict return value type: " << j.value<std::uint64_t>("uint64", 0) << '\n';
}
Output:
operator[]: 18446744073709551615
default value (int): -1
default value (uint64_t): 18446744073709551615
explict return value type: 18446744073709551615
Examples¶
Example: (1) access specified object element with default value
The example below shows how object elements can be queried with a default value.
#include <iostream>
#include <nlohmann/json.hpp>
using json = nlohmann::json;
int main()
{
// create a JSON object with different entry types
json j =
{
{"integer", 1},
{"floating", 42.23},
{"string", "hello world"},
{"boolean", true},
{"object", {{"key1", 1}, {"key2", 2}}},
{"array", {1, 2, 3}}
};
// access existing values
int v_integer = j.value("integer", 0);
double v_floating = j.value("floating", 47.11);
// access nonexisting values and rely on default value
std::string v_string = j.value("nonexisting", "oops");
bool v_boolean = j.value("nonexisting", false);
// output values
std::cout << std::boolalpha << v_integer << " " << v_floating
<< " " << v_string << " " << v_boolean << "\n";
}
Output:
1 42.23 oops false
Example: (2) access specified object element using string_view with default value
The example below shows how object elements can be queried with a default value.
#include <iostream>
#include <string_view>
#include <nlohmann/json.hpp>
using namespace std::string_view_literals;
using json = nlohmann::json;
int main()
{
// create a JSON object with different entry types
json j =
{
{"integer", 1},
{"floating", 42.23},
{"string", "hello world"},
{"boolean", true},
{"object", {{"key1", 1}, {"key2", 2}}},
{"array", {1, 2, 3}}
};
// access existing values
int v_integer = j.value("integer"sv, 0);
double v_floating = j.value("floating"sv, 47.11);
// access nonexisting values and rely on default value
std::string v_string = j.value("nonexisting"sv, "oops");
bool v_boolean = j.value("nonexisting"sv, false);
// output values
std::cout << std::boolalpha << v_integer << " " << v_floating
<< " " << v_string << " " << v_boolean << "\n";
}
Output:
1 42.23 oops false
Example: (3) access specified object element via JSON Pointer with default value
The example below shows how object elements can be queried with a default value.
#include <iostream>
#include <nlohmann/json.hpp>
using json = nlohmann::json;
using namespace nlohmann::literals;
int main()
{
// create a JSON object with different entry types
json j =
{
{"integer", 1},
{"floating", 42.23},
{"string", "hello world"},
{"boolean", true},
{"object", {{"key1", 1}, {"key2", 2}}},
{"array", {1, 2, 3}}
};
// access existing values
int v_integer = j.value("/integer"_json_pointer, 0);
double v_floating = j.value("/floating"_json_pointer, 47.11);
// access nonexisting values and rely on default value
std::string v_string = j.value("/nonexisting"_json_pointer, "oops");
bool v_boolean = j.value("/nonexisting"_json_pointer, false);
// output values
std::cout << std::boolalpha << v_integer << " " << v_floating
<< " " << v_string << " " << v_boolean << "\n";
}
Output:
1 42.23 oops false
See also¶
- see
at
for access by reference with range checking - see
operator[]
for unchecked access by reference
Version history¶
- Added in version 1.0.0. Changed parameter
default_value
type fromconst ValueType&
toValueType&&
in version 3.11.0. - Added in version 3.11.0. Made
ValueType
the first template parameter in version 3.11.2. - Added in version 2.0.2.