0

I'm new to ArduinoJSON - so perhaps it is a newbie's question.... but I wish to pass a StaticJsonDocument into a function as a parameter ( later on it should be implemented in a library ).

exmaple below shows test_1 what I wish to obtain, but by duplicating StaticJsonDocument, which I don't want to do.

How can test_1 should be written (as I tried in test_2)?

#include <ArduinoJson.h>

StaticJsonDocument<200> doc;

void createJSON() {
        doc["sensor"] = "gps";
        doc["time"] = 1351824120;

        JsonArray data = doc.createNestedArray("data");
        data.add(48.756080);
        data.add(2.302038);

        // Generate the minified JSON and send it to the Serial port.
        serializeJson(doc, Serial);
        Serial.println("JSON is created:");

        // Generate the prettified JSON and send it to the Serial port.
        serializeJsonPretty(doc, Serial);

}


bool test_1(StaticJsonDocument<100> _doc){
        serializeJson(_doc, Serial);
        return true;
}

bool test2(const JsonObject& _doc){
        Serial.println("HI");
        serializeJson(_doc, Serial);
}


void setup() {
        Serial.begin(9600);

        createJSON();
        test_1(doc);


}

void loop() {
        // not used in this example
}
  • 1
    bool test_1(StaticJsonDocument<DOC_SIZE>& _doc) { use a define or const for the size. it must be the same – Juraj Apr 20 at 14:40
  • @Juraj - why not posting it as an answer ? it works OK – Guy . D Apr 20 at 16:51
  • it is not about Arduino, but OK. I even found a better solution. (I know it is working, I tested it) – Juraj Apr 20 at 17:16
1

The StaticJsonDocument is a template class. The template value in <> is here only the size of the internal buffer, but every size used generates a different class. (memory usage!)

To have the parameter of the function take an StaticJsonDocument version instance, it must be the same version or a common base class. In this case the base class is JsonDocument.

If you don't use the reference symbol & the parameter is copied. In this case StaticJsonDocument<200> _doc or JsonDocument _doc would create a copy and that copy would be modified in the function. The object used as parameter value would be unchanged - empty.

So use

void test2(const JsonDocument& _doc) {
  Serial.println("HI");
  serializeJson(_doc, Serial);
}
  • Hey @Juraj, thanks for this answer. I'm trying to do exactly the same thing as @Guy .D, except when implementing your solution I'm getting a compiler error: no known conversion for argument 2 from ArduinoJson6101_000::StaticJsonDocument<168u>' to 'const JsonObject& {aka const ArduinoJson6101_000::ObjectRef&} Any advice would be great and I can post a code snippet if required. – Peza May 5 at 21:35
  • yes I'm using ArduinoJSON V6. – Peza May 7 at 2:40
  • sorry, the code snippet was from Guy's code, not from my test. corrected – Juraj May 7 at 3:40

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.