diff --git a/src/ArduinoJson/Variant/VariantImpl.hpp b/src/ArduinoJson/Variant/VariantImpl.hpp index e5cfe95e..e9c42dab 100644 --- a/src/ArduinoJson/Variant/VariantImpl.hpp +++ b/src/ArduinoJson/Variant/VariantImpl.hpp @@ -61,13 +61,15 @@ class VariantImpl { case VariantType::TinyString: return visit.visit(JsonString(data_->content.asTinyString)); - case VariantType::LongString: - return visit.visit(JsonString(data_->content.asStringNode->data, - data_->content.asStringNode->length)); + case VariantType::LongString: { + auto s = asStringNode(); + return visit.visit(JsonString(s->data, s->length)); + } - case VariantType::RawString: - return visit.visit(RawString(data_->content.asStringNode->data, - data_->content.asStringNode->length)); + case VariantType::RawString: { + auto s = asStringNode(); + return visit.visit(RawString(s->data, s->length)); + } case VariantType::Int32: return visit.visit(static_cast(data_->content.asInt32)); @@ -154,7 +156,7 @@ class VariantImpl { str = data_->content.asTinyString; break; case VariantType::LongString: - str = data_->content.asStringNode->data; + str = asStringNode()->data; break; case VariantType::Float: return static_cast(data_->content.asFloat); @@ -197,7 +199,7 @@ class VariantImpl { str = data_->content.asTinyString; break; case VariantType::LongString: - str = data_->content.asStringNode->data; + str = asStringNode()->data; break; case VariantType::Float: return convertNumber(data_->content.asFloat); @@ -215,9 +217,10 @@ class VariantImpl { JsonString asRawString() const { switch (type()) { - case VariantType::RawString: - return JsonString(data_->content.asStringNode->data, - data_->content.asStringNode->length); + case VariantType::RawString: { + auto s = asStringNode(); + return JsonString(s->data, s->length); + } default: return JsonString(); } @@ -227,14 +230,20 @@ class VariantImpl { switch (type()) { case VariantType::TinyString: return JsonString(data_->content.asTinyString); - case VariantType::LongString: - return JsonString(data_->content.asStringNode->data, - data_->content.asStringNode->length); + case VariantType::LongString: { + auto s = asStringNode(); + return JsonString(s->data, s->length); + } default: return JsonString(); } } + StringNode* asStringNode() const { + ARDUINOJSON_ASSERT(type() & VariantTypeBits::OwnedStringBit); + return data_->content.asStringNode; + } + #if ARDUINOJSON_USE_8_BYTE_POOL const EightByteValue* getEightByte() const { return type() & VariantTypeBits::EightByteBit