3

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
}
3
  • 1
    bool test_1(StaticJsonDocument<DOC_SIZE>& _doc) { use a define or const for the size. it must be the same Commented Apr 20, 2019 at 14:40
  • @Juraj - why not posting it as an answer ? it works OK Commented Apr 20, 2019 at 16:51
  • it is not about Arduino, but OK. I even found a better solution. (I know it is working, I tested it) Commented Apr 20, 2019 at 17:16

1 Answer 1

7

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);
}
3
  • 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. Commented May 5, 2019 at 21:35
  • yes I'm using ArduinoJSON V6. Commented May 7, 2019 at 2:40
  • 1
    sorry, the code snippet was from Guy's code, not from my test. corrected Commented May 7, 2019 at 3:40

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.