Putting DynamicJsonDocument in std::map

Hi there,

I’m trying to make some kind of cache to keep a parsed DynamicJsonDocument by key.
The code I’ve written is looking that way:

std::map<String, DynamicJsonDocument> jsonCache;
DynamicJsonDocument json(256);
jsonCache["key"] = json; // <-- line of code producing the error

When compiling that code I get following error.
I’ve no idea how to solve that.

src/IotAlarm.cpp:156:24:   required from here
/Users/innofriends/.platformio/packages/toolchain-xtensa/xtensa-lx106-elf/include/c++/4.8.2/tuple:1088:70: error: no matching function for call to 'ArduinoJson6150_0000010::BasicJsonDocument<ArduinoJson6150_0000010::DefaultAllocator>::BasicJsonDocument()'
         second(std::forward<_Args2>(std::get<_Indexes2>(__tuple2))...)
                                                                      ^
/Users/innofriends/.platformio/packages/toolchain-xtensa/xtensa-lx106-elf/include/c++/4.8.2/tuple:1088:70: note: candidates are:
In file included from .pio/libdeps/nodemcuv2/ArduinoJson_ID64/src/ArduinoJson/Document/DynamicJsonDocument.hpp:7:0,
                 from .pio/libdeps/nodemcuv2/ArduinoJson_ID64/src/ArduinoJson.hpp:21,
                 from .pio/libdeps/nodemcuv2/ArduinoJson_ID64/src/ArduinoJson.h:9,
                 from lib/InnoWiFi/InnoWiFi.h:9,
                 from include/IotAlarm.h:4,
                 from src/IotAlarm.cpp:4:
.pio/libdeps/nodemcuv2/ArduinoJson_ID64/src/ArduinoJson/Document/BasicJsonDocument.hpp:78:3: note: ArduinoJson6150_0000010::BasicJsonDocument<TAllocator>::BasicJsonDocument(ArduinoJson6150_0000010::VariantRef) [with TAllocator = ArduinoJson6150_0000010::DefaultAllocator]
   BasicJsonDocument(VariantRef src)
   ^
.pio/libdeps/nodemcuv2/ArduinoJson_ID64/src/ArduinoJson/Document/BasicJsonDocument.hpp:78:3: note:   candidate expects 1 argument, 0 provided
.pio/libdeps/nodemcuv2/ArduinoJson_ID64/src/ArduinoJson/Document/BasicJsonDocument.hpp:66:3: note: template<class T> ArduinoJson6150_0000010::BasicJsonDocument<TAllocator>::BasicJsonDocument(const T&, typename ArduinoJson6150_0000010::enable_if<(((((ArduinoJson6150_0000010::is_same<T, ArduinoJson6150_0000010::VariantRef>::value || ArduinoJson6150_0000010::is_same<T, ArduinoJson6150_0000010::VariantConstRef>::value) || ArduinoJson6150_0000010::is_same<T, ArduinoJson6150_0000010::ArrayRef>::value) || ArduinoJson6150_0000010::is_same<T, ArduinoJson6150_0000010::ArrayConstRef>::value) || ArduinoJson6150_0000010::is_same<T, ArduinoJson6150_0000010::ObjectRef>::value) || ArduinoJson6150_0000010::is_same<T, ArduinoJson6150_0000010::ObjectConstRef>::value)>::type*)
   BasicJsonDocument(
   ^
.pio/libdeps/nodemcuv2/ArduinoJson_ID64/src/ArduinoJson/Document/BasicJsonDocument.hpp:66:3: note:   template argument deduction/substitution failed:
In file included from /Users/innofriends/.platformio/packages/toolchain-xtensa/xtensa-lx106-elf/include/c++/4.8.2/functional:55:0,
                 from /Users/innofriends/.platformio/packages/toolchain-xtensa/xtensa-lx106-elf/include/c++/4.8.2/bits/stl_algo.h:66,
                 from /Users/innofriends/.platformio/packages/toolchain-xtensa/xtensa-lx106-elf/include/c++/4.8.2/algorithm:62,
                 from /Users/innofriends/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/Arduino.h:237,
                 from lib/InnoWiFi/InnoWiFi.h:6,
                 from include/IotAlarm.h:4,
                 from src/IotAlarm.cpp:4:
/Users/innofriends/.platformio/packages/toolchain-xtensa/xtensa-lx106-elf/include/c++/4.8.2/tuple:1088:70: note:   candidate expects 2 arguments, 0 provided
         second(std::forward<_Args2>(std::get<_Indexes2>(__tuple2))...)
                                                                      ^
In file included from .pio/libdeps/nodemcuv2/ArduinoJson_ID64/src/ArduinoJson/Document/DynamicJsonDocument.hpp:7:0,
                 from .pio/libdeps/nodemcuv2/ArduinoJson_ID64/src/ArduinoJson.hpp:21,
                 from .pio/libdeps/nodemcuv2/ArduinoJson_ID64/src/ArduinoJson.h:9,
                 from lib/InnoWiFi/InnoWiFi.h:9,
                 from include/IotAlarm.h:4,
                 from src/IotAlarm.cpp:4:
.pio/libdeps/nodemcuv2/ArduinoJson_ID64/src/ArduinoJson/Document/BasicJsonDocument.hpp:60:3: note: ArduinoJson6150_0000010::BasicJsonDocument<TAllocator>::BasicJsonDocument(const ArduinoJson6150_0000010::JsonDocument&) [with TAllocator = ArduinoJson6150_0000010::DefaultAllocator]
   BasicJsonDocument(const JsonDocument& src) {
   ^
.pio/libdeps/nodemcuv2/ArduinoJson_ID64/src/ArduinoJson/Document/BasicJsonDocument.hpp:60:3: note:   candidate expects 1 argument, 0 provided
.pio/libdeps/nodemcuv2/ArduinoJson_ID64/src/ArduinoJson/Document/BasicJsonDocument.hpp:55:3: note: ArduinoJson6150_0000010::BasicJsonDocument<TAllocator>::BasicJsonDocument(ArduinoJson6150_0000010::BasicJsonDocument<TAllocator>&&) [with TAllocator = ArduinoJson6150_0000010::DefaultAllocator]
   BasicJsonDocument(BasicJsonDocument&& src) : AllocatorOwner<TAllocator>(src) {
   ^
.pio/libdeps/nodemcuv2/ArduinoJson_ID64/src/ArduinoJson/Document/BasicJsonDocument.hpp:55:3: note:   candidate expects 1 argument, 0 provided
.pio/libdeps/nodemcuv2/ArduinoJson_ID64/src/ArduinoJson/Document/BasicJsonDocument.hpp:48:3: note: ArduinoJson6150_0000010::BasicJsonDocument<TAllocator>::BasicJsonDocument(const ArduinoJson6150_0000010::BasicJsonDocument<TAllocator>&) [with TAllocator = ArduinoJson6150_0000010::DefaultAllocator]
   BasicJsonDocument(const BasicJsonDocument& src)
   ^
.pio/libdeps/nodemcuv2/ArduinoJson_ID64/src/ArduinoJson/Document/BasicJsonDocument.hpp:48:3: note:   candidate expects 1 argument, 0 provided
.pio/libdeps/nodemcuv2/ArduinoJson_ID64/src/ArduinoJson/Document/BasicJsonDocument.hpp:44:12: note: ArduinoJson6150_0000010::BasicJsonDocument<TAllocator>::BasicJsonDocument(size_t, TAllocator) [with TAllocator = ArduinoJson6150_0000010::DefaultAllocator; size_t = unsigned int]
   explicit BasicJsonDocument(size_t capa, TAllocator alloc = TAllocator())
            ^
.pio/libdeps/nodemcuv2/ArduinoJson_ID64/src/ArduinoJson/Document/BasicJsonDocument.hpp:44:12: note:   candidate expects 2 arguments, 0 provided
*** [.pio/build/nodemcuv2/src/IotAlarm.cpp.o] Error 1

Got the solution. For others having the same problem.
You can fix it deriving your own class from DynamicJsonDocument.

class ConfigurationJson : public DynamicJsonDocument
{
public:
    ConfigurationJson() : DynamicJsonDocument(256)
    {
    }
};
1 Like
BasicJsonDocument<TAllocator>::BasicJsonDocument
[..]
candidate expects 1 argument, 0 provided

I’m pretty sure these are all allocation related. The std::map needs a class / object which it can construct without an argument. All the present constructors seem to want at least a length (capacity) or another Json object to clone themselves from. This prevents their usage in a std::map.

Now you can either try and provide an allocator yourself (see docs for syntax) or you can store pointer references (and make sure the objects you are pointing to are not deallocated without you doing so explicitly… e.g., use new and delete).

As this is not PlatformIO related but C++ related, you might also to try and get a better answer on sites like stackoverflow.com/.

1 Like

Thanks for your reply!