From 60a767c706e99cd72acea6519db18e43c07c2565 Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Wed, 23 Jul 2025 16:14:03 +0200 Subject: [PATCH] JsonSerializer: use iterators to serialize array and objects --- src/ArduinoJson/Json/JsonSerializer.hpp | 36 +++++++++++-------------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/src/ArduinoJson/Json/JsonSerializer.hpp b/src/ArduinoJson/Json/JsonSerializer.hpp index 30b67cb4..c26b28dc 100644 --- a/src/ArduinoJson/Json/JsonSerializer.hpp +++ b/src/ArduinoJson/Json/JsonSerializer.hpp @@ -22,17 +22,14 @@ class JsonSerializer : public VariantDataVisitor { size_t visitArray(const VariantImpl& array) { write('['); - auto slotId = array.head(); + bool first = true; - while (slotId != NULL_SLOT) { - auto slot = resources_->getVariant(slotId); - - VariantImpl(slot, resources_).accept(*this); - - slotId = slot->next; - - if (slotId != NULL_SLOT) + for (auto it = array.createIterator(); !it.done(); it.move()) { + if (!first) write(','); + + it->accept(*this); + first = false; } write(']'); @@ -42,20 +39,19 @@ class JsonSerializer : public VariantDataVisitor { size_t visitObject(const VariantImpl& object) { write('{'); - auto slotId = object.head(); + bool first = true; + bool isValue = false; - bool isKey = true; + for (auto it = object.createIterator(); !it.done(); it.move()) { + if (isValue) + write(':'); + else if (!first) + write(','); - while (slotId != NULL_SLOT) { - auto slot = resources_->getVariant(slotId); - VariantImpl(slot, resources_).accept(*this); + it->accept(*this); - slotId = slot->next; - - if (slotId != NULL_SLOT) - write(isKey ? ':' : ','); - - isKey = !isKey; + first = false; + isValue = !isValue; } write('}');