1
0
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:
Niels
2016-04-16 20:45:40 +02:00
parent 007359675b
commit f834965b44
3 changed files with 177 additions and 2 deletions

View File

@ -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);
}
};