Как добавить один JsonDocument в другой в ArduinoJson
Я использую эту библиотеку json: https://arduinojson.org/
Я пытаюсь написать функцию, которая создает объект ответа и оборачивает уже созданный документ json:
void sendResponse(
ResponseType state,
JsonDocument *response
) {
DynamicJsonDocument doc(256);
doc[F("state")] = responseTypeFromEnum(state);
doc[F("response")] = response; //breaks; how to do?
this->sendJson(&doc);
}
Конечно, это не получается, и я нигде не вижу хорошего решения...
Я знаю, что могу использовать createNestedObject()
, но, похоже, для этого потребуется заново создать данный объект json вручную? Это неоптимальный случай.
Есть ли способ легко обернуть существующий JsonDocument в другой?
Ищу
{
"some": "other document"
}
И оберните это так
{
"state":"OK"
"response": {
"some": "other document"
}
}
@Snappawapa, 👍1
1 ответ
Лучший ответ:
Вы можете добавить JsonDocument
внутри другого документа, но вам необходимо передать документ по значению, а не по указателю.
Поскольку вы получаете указатель, вам необходимо разыменовать его, прежде чем пытаться присвоить:
doc[F("response")] = *response;
Узел 1: этой проблемы можно избежать, передав response
по ссылке, например:
void sendResponse(ResponseType state, const JsonDocument &response) {
DynamicJsonDocument doc(256);
doc[F("state")] = responseTypeFromEnum(state);
doc[F("response")] = response;
this->sendJson(doc);
}
Узел 2: вызов оператора присваивания (=
) вызывает глубокую копию документа response
. Вы можете избежать этого копирования, вызвав вместо этого shallowCopy()
:
doc[F("response")].shallowCopy(response);
Узел 3: к сожалению, shallowCopy()
недоступен в ArduinoJson 7.
- Arduino создает массив Json с двойными значениями и 2 десятичными знаками
- ArduinoJson читает `null` из последовательного порта
- Как объявить массив переменного размера (глобально)
- Программирование Arduino с использованием Python, а не C/C ++
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Является ли использование malloc() и free() действительно плохой идеей для Arduino?
- Как справиться с rollover millis()?
- Можно ли сделать несколько функций loop() с помощью Arduino Uno?
Интересно на узле 3. Похоже,
shallowCopy()
появился только в 6, так почему же его нет в 7? Неужели там нет эквивалента? Похоже, я сейчас использую 6, но у меня компилируется нормально. Спасибо за точку, @SnappawapaИзвините, "Node" должен был быть "Note" :-) Действительно, я удалил
shallowCopy()
, потому чтоJsonDocument
больше не хранит указатели на варианты. Вместо этого он сохраняет индексы относительно текущего документа. Можно было бы воссоздатьshallowCopy()
, но это потребовало бы дополнительной сантехники (а значит, и дополнительного веса), и я не думаю, что оно того стоит., @Benoit BlanchonСпасибо за заметку! Лично я могу утверждать, что некоторая дополнительная обработка кода стоит потенциально большой экономии конечного использования оперативной памяти :) (при условии, что это не астрономически сложно сделать), @Snappawapa
Да, но с другой стороны, избежать такой ситуации не так уж и сложно. Пример см. в [руководстве по обновлению](https://arduinojson.org/v7/how-to/upgrade-from-v6/)., @Benoit Blanchon