Skip to content

Commit d69b072

Browse files
committed
Support JsonValue arrays in ArrayJsonHandler.
1 parent fb6dbf6 commit d69b072

2 files changed

Lines changed: 23 additions & 5 deletions

File tree

CesiumJsonReader/include/CesiumJsonReader/ArrayJsonHandler.h

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -274,12 +274,16 @@ class CESIUMJSONREADER_API
274274

275275
virtual IJsonHandler* readArrayStart() override {
276276
if (this->_arrayIsOpen) {
277-
return this->invalid("An array")->readArrayStart();
277+
// An array inside an array
278+
CESIUM_ASSERT(this->_pArray);
279+
CesiumUtility::JsonValue& o = this->_pArray->emplace_back();
280+
this->_objectHandler.reset(this, &o);
281+
return this->_objectHandler.readArrayStart();
282+
} else {
283+
this->_arrayIsOpen = true;
284+
this->_pArray->clear();
285+
return this;
278286
}
279-
280-
this->_arrayIsOpen = true;
281-
this->_pArray->clear();
282-
return this;
283287
}
284288

285289
virtual IJsonHandler* readArrayEnd() override { return this->parent(); }

CesiumJsonReader/test/TestArrayJsonHandler.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,20 @@ TEST_CASE("ArrayJsonHandler<JsonValue, JsonObjectJsonHandler>") {
346346
CHECK((*result.value)[1].getUint64() == 42);
347347
CHECK((*result.value)[2].getBool() == true);
348348
}
349+
350+
SUBCASE("reads array element that is itself an array") {
351+
auto result = readArray<Handler>("[1, [2, 3], \"after\"]");
352+
REQUIRE(result.value.has_value());
353+
CHECK(result.warnings.empty());
354+
REQUIRE(result.value->size() == 3);
355+
CHECK((*result.value)[0].getUint64() == 1);
356+
REQUIRE((*result.value)[1].isArray());
357+
const auto& inner = (*result.value)[1].getArray();
358+
REQUIRE(inner.size() == 2);
359+
CHECK(inner[0].getUint64() == 2);
360+
CHECK(inner[1].getUint64() == 3);
361+
CHECK((*result.value)[2].getString() == "after");
362+
}
349363
}
350364

351365
TEST_CASE("ArrayJsonHandler<T, THandler> (primary template, objects)") {

0 commit comments

Comments
 (0)