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
}
asked Apr 20, 2019 at 5:49
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);
}
answered Apr 20, 2019 at 17:15
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

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.