diff options
Diffstat (limited to 'source/core/StarJson.cpp')
-rw-r--r-- | source/core/StarJson.cpp | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/source/core/StarJson.cpp b/source/core/StarJson.cpp index 3502996..83b4e67 100644 --- a/source/core/StarJson.cpp +++ b/source/core/StarJson.cpp @@ -1026,13 +1026,25 @@ Json jsonMerge(Json const& base, Json const& merger) { res.first->second = jsonMerge(res.first->second, p.second); } return merged; + } + return merger.type() == Json::Type::Null ? base : merger; +} - } else if (merger.type() == Json::Type::Null) { - return base; - - } else { - return merger; +Json jsonMergeNulling(Json const& base, Json const& merger) { + if (base.type() == Json::Type::Object && merger.type() == Json::Type::Object) { + JsonObject merged = base.toObject(); + for (auto const& p : merger.toObject()) { + if (p.second.isNull()) + merged.erase(p.first); + else { + auto res = merged.insert(p); + if (!res.second) + res.first->second = jsonMergeNulling(res.first->second, p.second); + } + } + return merged; } + return merger; } bool jsonPartialMatch(Json const& base, Json const& compare) { |