mirror of
https://github.com/nlohmann/json.git
synced 2025-07-15 07:41:50 +03:00
started fixing #323
This commit is contained in:
@ -8733,6 +8733,12 @@ class basic_json
|
||||
/*!
|
||||
@brief return a reference to the pointed to value
|
||||
|
||||
@note This version does not throw if a value is not present, but tries
|
||||
to create nested values instead. For instance, calling this function
|
||||
with pointer `"/this/that"` on a null value is equivalent to calling
|
||||
`operator[]("this").operator[]("that")` on that value, effectively
|
||||
changing the null value to an object.
|
||||
|
||||
@param[in] ptr a JSON value
|
||||
|
||||
@return reference to the JSON value pointed to by the JSON pointer
|
||||
@ -8747,6 +8753,12 @@ class basic_json
|
||||
{
|
||||
for (const auto& reference_token : reference_tokens)
|
||||
{
|
||||
// error condition (cf. RFC 6901, Sect. 4)
|
||||
if (reference_token.size() > 1 and reference_token[0] == '0')
|
||||
{
|
||||
throw std::domain_error("array index must not begin with '0'");
|
||||
}
|
||||
|
||||
switch (ptr->m_type)
|
||||
{
|
||||
case value_t::object:
|
||||
@ -8758,12 +8770,6 @@ class basic_json
|
||||
|
||||
case value_t::array:
|
||||
{
|
||||
// error condition (cf. RFC 6901, Sect. 4)
|
||||
if (reference_token.size() > 1 and reference_token[0] == '0')
|
||||
{
|
||||
throw std::domain_error("array index must not begin with '0'");
|
||||
}
|
||||
|
||||
if (reference_token == "-")
|
||||
{
|
||||
// explicityly treat "-" as index beyond the end
|
||||
@ -8777,6 +8783,37 @@ class basic_json
|
||||
break;
|
||||
}
|
||||
|
||||
// null values are converted to arrays or objects
|
||||
case value_t::null:
|
||||
{
|
||||
// check if reference token is a number
|
||||
const bool nums = std::all_of(reference_token.begin(),
|
||||
reference_token.end(),
|
||||
[](const char x)
|
||||
{
|
||||
return std::isdigit(x);
|
||||
});
|
||||
|
||||
if (nums)
|
||||
{
|
||||
// if reference token consists solely of numbers
|
||||
// use it as array index -> create array
|
||||
ptr = &ptr->operator[](static_cast<size_type>(std::stoi(reference_token)));
|
||||
}
|
||||
else if (reference_token == "-")
|
||||
{
|
||||
// explicityly treat "-" as index beyond the end
|
||||
// which is 0 for an empty array -> create array
|
||||
ptr = &ptr->operator[](0);
|
||||
}
|
||||
else
|
||||
{
|
||||
// treat reference token as key -> create object
|
||||
ptr = &ptr->operator[](reference_token);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
throw std::out_of_range("unresolved reference token '" + reference_token + "'");
|
||||
|
Reference in New Issue
Block a user