@@ -60,9 +60,12 @@ struct Converter<T, detail::enable_if_t<detail::is_integral<T>::value &&
6060 : private detail::VariantAttorney {
6161 static bool toJson (T src, JsonVariant dst) {
6262 ARDUINOJSON_ASSERT_INTEGER_TYPE_IS_SUPPORTED (T);
63- auto variant = getVariantImpl (dst);
64- variant.clear ();
65- return variant.setInteger (src);
63+ auto data = getData (dst);
64+ auto resources = getResourceManager (dst);
65+ if (!data)
66+ return false ;
67+ detail::VariantImpl::clear (data, resources);
68+ return detail::VariantImpl::setInteger (src, data, resources);
6669 }
6770
6871 static T fromJson (JsonVariantConst src) {
@@ -94,9 +97,13 @@ struct Converter<T, detail::enable_if_t<detail::is_enum<T>::value>>
9497template <>
9598struct Converter <bool > : private detail::VariantAttorney {
9699 static bool toJson (bool src, JsonVariant dst) {
97- auto variant = getVariantImpl (dst);
98- variant.clear ();
99- return variant.setBoolean (src);
100+ auto data = getData (dst);
101+ auto resources = getResourceManager (dst);
102+ if (!data)
103+ return false ;
104+ detail::VariantImpl::clear (data, resources);
105+ data->setBoolean (src);
106+ return true ;
100107 }
101108
102109 static bool fromJson (JsonVariantConst src) {
@@ -134,9 +141,12 @@ struct Converter<T, detail::enable_if_t<detail::is_floating_point<T>::value>>
134141template <>
135142struct Converter <const char *> : private detail::VariantAttorney {
136143 static void toJson (const char * src, JsonVariant dst) {
137- auto variant = getVariantImpl (dst);
138- variant.clear ();
139- variant.setString (detail::adaptString (src));
144+ auto data = getData (dst);
145+ auto resources = getResourceManager (dst);
146+ if (!data)
147+ return ;
148+ detail::VariantImpl::clear (data, resources);
149+ detail::VariantImpl::setString (detail::adaptString (src), data, resources);
140150 }
141151
142152 static const char * fromJson (JsonVariantConst src) {
@@ -151,10 +161,14 @@ struct Converter<const char*> : private detail::VariantAttorney {
151161
152162template <>
153163struct Converter <JsonString> : private detail::VariantAttorney {
154- static void toJson (JsonString src, JsonVariant dst) {
155- auto variant = getVariantImpl (dst);
156- variant.clear ();
157- variant.setString (detail::adaptString (src));
164+ static bool toJson (JsonString src, JsonVariant dst) {
165+ auto data = getData (dst);
166+ auto resources = getResourceManager (dst);
167+ if (!data)
168+ return false ;
169+ detail::VariantImpl::clear (data, resources);
170+ return detail::VariantImpl::setString (detail::adaptString (src), data,
171+ resources);
158172 }
159173
160174 static JsonString fromJson (JsonVariantConst src) {
@@ -168,11 +182,15 @@ struct Converter<JsonString> : private detail::VariantAttorney {
168182};
169183
170184template <typename T>
171- inline detail::enable_if_t <detail::IsString<T>::value> convertToJson (
185+ inline detail::enable_if_t <detail::IsString<T>::value, bool > convertToJson (
172186 const T& src, JsonVariant dst) {
173- auto variant = detail::VariantAttorney::getVariantImpl (dst);
174- variant.clear ();
175- variant.setString (detail::adaptString (src));
187+ auto data = detail::VariantAttorney::getData (dst);
188+ auto resources = detail::VariantAttorney::getResourceManager (dst);
189+ if (!data)
190+ return false ;
191+ detail::VariantImpl::clear (data, resources);
192+ return detail::VariantImpl::setString (detail::adaptString (src), data,
193+ resources);
176194}
177195
178196// SerializedValue<std::string>
@@ -190,7 +208,10 @@ struct Converter<SerializedValue<T>> : private detail::VariantAttorney {
190208template <>
191209struct Converter <detail::nullptr_t > : private detail::VariantAttorney {
192210 static void toJson (detail::nullptr_t , JsonVariant dst) {
193- getVariantImpl (dst).clear ();
211+ auto data = getData (dst);
212+ auto resources = getResourceManager (dst);
213+ if (data)
214+ detail::VariantImpl::clear (data, resources);
194215 }
195216 static detail::nullptr_t fromJson (JsonVariantConst) {
196217 return nullptr ;
0 commit comments