mirror of
https://github.com/nlohmann/json.git
synced 2025-07-13 20:21:48 +03:00
implemented deflatten function
This commit is contained in:
@ -8165,7 +8165,6 @@ class basic_json
|
||||
}
|
||||
|
||||
private:
|
||||
/// return referenced value
|
||||
reference get(reference j) const
|
||||
{
|
||||
pointer result = &j;
|
||||
@ -8190,6 +8189,49 @@ class basic_json
|
||||
return *result;
|
||||
}
|
||||
|
||||
reference get2(reference j) const
|
||||
{
|
||||
pointer result = &j;
|
||||
|
||||
for (const auto& reference_token : reference_tokens)
|
||||
{
|
||||
switch (result->m_type)
|
||||
{
|
||||
case value_t::null:
|
||||
{
|
||||
if (reference_token == "0")
|
||||
{
|
||||
result = &result->operator[](0);
|
||||
}
|
||||
else
|
||||
{
|
||||
result = &result->operator[](reference_token);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
case value_t::object:
|
||||
{
|
||||
result = &result->operator[](reference_token);
|
||||
continue;
|
||||
}
|
||||
|
||||
case value_t::array:
|
||||
{
|
||||
result = &result->operator[](static_cast<size_t>(std::stoi(reference_token)));
|
||||
continue;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
throw std::domain_error("unresolved reference token '" + reference_token + "'");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return *result;
|
||||
}
|
||||
|
||||
const_reference get(const_reference j) const
|
||||
{
|
||||
const_pointer result = &j;
|
||||
@ -8352,6 +8394,35 @@ class basic_json
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
@param[in] value flattened JSON
|
||||
|
||||
@return deflattened JSON
|
||||
*/
|
||||
static basic_json deflatten(const basic_json& value)
|
||||
{
|
||||
if (not value.is_object())
|
||||
{
|
||||
throw std::domain_error("only objects can be deflattened");
|
||||
}
|
||||
|
||||
basic_json result;
|
||||
|
||||
// iterate the JSON object values
|
||||
for (const auto& element : *value.m_value.object)
|
||||
{
|
||||
if (not element.second.is_primitive())
|
||||
{
|
||||
throw std::domain_error("values in object must be primitive");
|
||||
}
|
||||
|
||||
// assign value to reference pointed to by JSON pointer
|
||||
json_pointer(element.first).get2(result) = element.second;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
||||
/*!
|
||||
@ -8363,6 +8434,14 @@ class basic_json
|
||||
json_pointer::flatten("", *this, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
/*!
|
||||
@return the original JSON from a flattened version
|
||||
*/
|
||||
basic_json deflatten() const
|
||||
{
|
||||
return json_pointer::deflatten(*this);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user