void CompareJson(json::Value& lhs, json::Value& rhs, json::Value& output) { std::string lstr, rstr; if (rhs.type() != lhs.type()) return; switch (lhs.type()) { case json::Value::tString: lstr = lhs.getString(); rstr = rhs.getString(); if (!lstr.empty() && lstr[0] == '$' && lstr.back() == '$') { size_t slash = lstr.find('/'); std::string cat = lstr.substr(1, slash - 1); std::string name = lstr.substr(slash + 1, lstr.length() - slash - 2); output[cat][name] = rstr; } break; case json::Value::tArray: for (size_t i = 0; i < lhs.length(); ++i) { if (i < rhs.length()) { CompareJson(lhs[i], rhs[i], output); } } break; case json::Value::tObject: for (auto it = lhs.begin(); it != lhs.end(); ++it) { if (rhs.has(it.key())) { CompareJson(*it, rhs[it.key()], output); } } break; } }