JsonSerializer: use iterators to serialize array and objects

This commit is contained in:
Benoit Blanchon
2025-07-23 16:14:03 +02:00
parent 274fe06b33
commit 60a767c706

View File

@@ -22,17 +22,14 @@ class JsonSerializer : public VariantDataVisitor<size_t> {
size_t visitArray(const VariantImpl& array) { size_t visitArray(const VariantImpl& array) {
write('['); write('[');
auto slotId = array.head(); bool first = true;
while (slotId != NULL_SLOT) { for (auto it = array.createIterator(); !it.done(); it.move()) {
auto slot = resources_->getVariant(slotId); if (!first)
VariantImpl(slot, resources_).accept(*this);
slotId = slot->next;
if (slotId != NULL_SLOT)
write(','); write(',');
it->accept(*this);
first = false;
} }
write(']'); write(']');
@@ -42,20 +39,19 @@ class JsonSerializer : public VariantDataVisitor<size_t> {
size_t visitObject(const VariantImpl& object) { size_t visitObject(const VariantImpl& object) {
write('{'); 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) { it->accept(*this);
auto slot = resources_->getVariant(slotId);
VariantImpl(slot, resources_).accept(*this);
slotId = slot->next; first = false;
isValue = !isValue;
if (slotId != NULL_SLOT)
write(isKey ? ':' : ',');
isKey = !isKey;
} }
write('}'); write('}');