Как добавить один 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"
  }
}

, 👍1


1 ответ


Лучший ответ:

0

Вы можете добавить 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.

,

Интересно на узле 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