8000 Filter nested object · enginux/ArduinoJson@ce4e14a · GitHub
[go: up one dir, main page]

Skip to content

Commit ce4e14a

Browse files
committed
Filter nested object
1 parent 4ac969d commit ce4e14a

File tree

2 files ch 8000 anged

+20
-15
lines changed

2 files changed

+20
-15
lines changed

extras/tests/MsgPackDeserializer/filter.cpp

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -684,48 +684,51 @@ TEST_CASE("deserializeMsgPack() filter") {
684684
}
685685
}
686686

687-
SECTION("Filter = {onlyobj:{*:true},include:true}") {
688-
filter["onlyobj"]["*"] = true;
687+
SECTION("Filter = {onlyobj:{measure:true},include:true}") {
688+
filter["onlyobj"]["measure"] = true;
689689
filter["include"] = true;
690690

691691
CAPTURE(filter.as<std::string>());
692692

693693
SECTION("include fixmap") {
694-
error = deserializeMsgPack(
695-
doc, "\x82\xA7onlyobj\x81\xA7outcome\x02\xA7include\x2A", filterOpt);
694+
error = deserializeMsgPack(doc,
695+
"\x82\xA7onlyobj"
696+
"\x82\xA8location\x01\xA7measure\x02"
697+
"\xA7include\x2A",
698+
filterOpt);
696699

697700
CHECK(error == DeserializationError::Ok);
698701
CHECK(doc.as<std::string>() ==
699-
"{\"onlyobj\":{\"outcome\":2},\"include\":42}");
702+
"{\"onlyobj\":{\"measure\":2},\"include\":42}");
700703
CHECK(doc.memoryUsage() ==
701704
JSON_OBJECT_SIZE(2) + JSON_OBJECT_SIZE(1) + 24);
702705
}
703706

704707
SECTION("include map 16") {
705708
error = deserializeMsgPack(doc,
706709
"\x82\xA7onlyobj"
707-
"\xDE\x00\x01\xA7outcome\x02"
710+
"\xDE\x00\x02\xA8location\x01\xA7measure\x02"
708711
"\xA7include\x2A",
709712
filterOpt);
710713

711714
CHECK(error == DeserializationError::Ok);
712715
CHECK(doc.as<std::string>() ==
713-
"{\"onlyobj\":{\"outcome\":2},\"include\":42}");
716+
"{\"onlyobj\":{\"measure\":2},\"include\":42}");
714717
CHECK(doc.memoryUsage() ==
715718
JSON_OBJECT_SIZE(2) + JSON_OBJECT_SIZE(1) + 24);
716719
}
717720

718721
SECTION("include map 32") {
719722
error = deserializeMsgPack(doc,
720723
"\x82\xA7onlyobj"
721-
"\xDF\x00\x00\x00\x01"
722-
"\xA7outcome\x02"
724+
"\xDF\x00\x00\x00\x02"
725+
"\xA8location\x01\xA7measure\x02"
723726
"\xA7include\x2A",
724727
filterOpt);
725728

726729
CHECK(error == DeserializationError::Ok);
727730
CHECK(doc.as<std::string>() ==
728-
"{\"onlyobj\":{\"outcome\":2},\"include\":42}");
731+
"{\"onlyobj\":{\"measure\":2},\"include\":42}");
729732
CHECK(doc.memoryUsage() ==
730733
JSON_OBJECT_SIZE(2) + JSON_OBJECT_SIZE(1) + 24);
731734
}

src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -198,13 +198,13 @@ class MsgPackDeserializer {
198198

199199
case 0xde:
200200
if (filter.allowObject())
201-
return readObject<uint16_t>(variant.toObject(), nestingLimit);
201+
return readObject<uint16_t>(variant.toObject(), filter, nestingLimit);
202202
else
203203
return skipObject<uint16_t>(nestingLimit);
204204

205205
case 0xdf:
206206
if (filter.allowObject())
207-
return readObject<uint32_t>(variant.toObject(), nestingLimit);
207+
return readObject<uint32_t>(variant.toObject(), filter, nestingLimit);
208208
else
209209
return skipObject<uint32_t>(nestingLimit);
210210
}
@@ -480,12 +480,13 @@ class MsgPackDeserializer {
480480
return true;
481481
}
482482

483-
template <typename TSize>
484-
bool readObject(CollectionData &object, NestingLimit nestingLimit) {
483+
template <typename TSize, typename TFilter>
484+
bool readObject(CollectionData &object, TFilter filter,
485+
NestingLimit nestingLimit) {
485486
TSize size;
486487
if (!readInteger(size))
487488
return false;
488-
return readObject(object, size, AllowAllFilter(), nestingLimit);
489+
return readObject(object, size, filter, nestingLimit);
489490
}
490491

491492
template <typename TSize>
@@ -537,6 +538,7 @@ class MsgPackDeserializer {
537538
}
538539

539540
bool skipObject(size_t n, NestingLimit nestingLimit) {
541+
// TODO: cover in tests
540542
if (nestingLimit.reached()) {
541543
_error = DeserializationError::TooDeep;
542544
return false;

0 commit comments

Comments
 (0)
0