Json::Value JsonSerializer::toValue(AnyValue val) const { auto info = val.type_info(); if (val.isType<bool>()) { bool v = val.as<bool>(); return Json::Value(v); } else if (info.isIntegral()) { if (info.isUnsigned()) { uint64_t v = val.as<uint64_t>(); return Json::Value((Json::Value::UInt64)v); } else { int64_t v = val.as<int64_t>(); return Json::Value((Json::Value::Int64)v); } } else if (info.isFloatingPoint()) { double v = val.as<double>(); return Json::Value(v); } else if (val.isType<std::vector<AnyValue>>()) { Json::Value res = Json::arrayValue; std::vector<AnyValue> v = val.as < std::vector<AnyValue>>(); for (AnyValue any : v) res.append(this->toValue(any)); return res; } else if (val.isType<Bundle>()) { Json::Value res = Json::objectValue; Bundle b = val.as<Bundle>(); for (const auto& val : b) { res[val.first] = this->toValue(val.second); } return res; } else if (val.isType<std::nullptr_t>()) { return Json::nullValue; } else if (val.isSerializable()) { return this->toValue(val.serialize()); } else if (val.isConvertibleTo<std::string>()) { std::string v = val.as<std::string>(); return Json::Value(v); } else { throw std::logic_error("Type is not convertible."); } }