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
keyor a given default value if no element with keykeyexists.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
KeyTypeis comparable withtypename object_t::key_typeandtypename object_comparator_t::is_transparentdenotes a type. -
Returns either a copy of an object's element at the specified JSON pointer
ptror a given default value if no value atptrexists.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/ptrwas not found. - Unlike
operator[], this function does not implicitly add an element to the position defined bykey/ptrkey. This function is furthermore also applicable to const objects.
Template parameters¶
KeyType- A type for an object key other than
json_pointerthat is comparable withstring_tusingobject_comparator_t. This can also be a string view (C++17). ValueType- type compatible to JSON values, for instance
intfor JSON integer numbers,boolfor JSON booleans, orstd::vectortypes for JSON arrays. Note the type of the expected value atkey/ptrand the default valuedefault_valuemust be compatible.
Parameters¶
key(in)- key of the element to access
default_value(in)- the value to return if
key/ptrfound no value ptr(in)- a JSON pointer to the element to access
Return value¶
- copy of the element at key
keyordefault_valueifkeyis not found - copy of the element at key
keyordefault_valueifkeyis not found - copy of the element at JSON Pointer
ptrordefault_valueif no value forptris 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.302ifdefault_valuedoes not match the type of the value atkey - Throws
type_error.306if 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.302ifdefault_valuedoes not match the type of the value atptr - Throws
type_error.306if 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'
<< "explicit return value type: " << j.value<std::uint64_t>("uint64", 0) << '\n';
}
Output:
operator[]: 18446744073709551615
default value (int): -1
default value (uint64_t): 18446744073709551615
explicit 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
atfor access by reference with range checking - see
operator[]for unchecked access by reference
Version history¶
- Added in version 1.0.0. Changed parameter
default_valuetype fromconst ValueType&toValueType&&in version 3.11.0. - Added in version 3.11.0. Made
ValueTypethe first template parameter in version 3.11.2. - Added in version 2.0.2.