ArduinoJSON: использование ссылки на ссылку при анализе массива массивов
Я начал экспериментировать с библиотекой ArduinoJson, чтобы анализировать данные, полученные от одного из моих API (формат данных JSON, из которых я получаю мой API, безусловно, можно улучшить, но программное обеспечение, с помощью которого мне пришлось реализовать API, довольно ограничено в форматировании строк JSON). Данные форматируются как массив массивов следующим образом:
[["P101","1.2345","bar(a)"],["P102","1234.567","mbar"],["P103","2345.678","mbar"],["P104","2.3456","bar(a)"]]
Чтобы получить первое представление о том, сколько памяти необходимо, я использовал Помощник ArduinoJSON для анализа моего набора данных и расчета памяти требования и получите очень простой фрагмент кода для анализа данных. Фрагмент кода, созданный помощником, выглядит следующим образом:
const size_t bufferSize = 4*JSON_ARRAY_SIZE(3) + JSON_ARRAY_SIZE(4) + 90;
DynamicJsonBuffer jsonBuffer(bufferSize);
const char* json = "[[\"P101\",\"1.2345\",\"bar(a)\"],[\"P102\",\"1234.567\",\"mbar\"],[\"P103\",\"2345.678\",\"mbar\"],[\"P104\",\"2.3456\",\"bar(a)\"]]";
JsonArray& root = jsonBuffer.parseArray(json);
JsonArray& root_ = root;
JsonArray& root_0 = root_[0];
const char* root_00 = root_0[0]; // "P101"
const char* root_01 = root_0[1]; // "1.2345"
const char* root_02 = root_0[2]; // "bar(a)"
JsonArray& root_1 = root_[1];
const char* root_10 = root_1[0]; // "P102"
const char* root_11 = root_1[1]; // "1234.567"
const char* root_12 = root_1[2]; // "mbar"
JsonArray& root_2 = root_[2];
const char* root_20 = root_2[0]; // "P103"
const char* root_21 = root_2[1]; // "2345.678"
const char* root_22 = root_2[2]; // "mbar"
JsonArray& root_3 = root_[3];
const char* root_30 = root_3[0]; // "P104"
const char* root_31 = root_3[1]; // "2.3456"
const char* root_32 = root_3[2]; // "bar(a)"
Я еще не проверял это, но взглянул на созданный фрагмент и наткнулся на эти строки:
JsonArray& root = jsonBuffer.parseArray(json);
JsonArray& root_ = root;
В чем конкретное преимущество использования адресных ссылок root
, root_
и, например, root_1
здесь? Насколько я понял код, они должны ссылаться на одни и те же данные в конце. Это только для удобства чтения?
@albert, 👍1
2 ответа
Преимущество ссылки над указателями:
- Ссылки не могут иметь значение NULL, поэтому их гораздо безопаснее использовать.
- Адрес ссылки не может быть получен. Это означает, что вызывающая функция не может испортить что-либо за пределами передаваемого типа (значения).
Для передачи ссылки на адрес применяются те же преимущества (не может быть NULL, адрес не может быть изменен).
Кроме того, нельзя использовать адресную арифметику (адрес + xxx или адрес - xxx), что предотвращает сложные ошибки программирования, когда значения за пределами пространства памяти переменной могут быть изменены.
Это не ссылка на ссылку. Это копия справки.
Генератор должен обрабатывать более сложные входные данные JSON, чем ваши, и для того, чтобы сделать вывод читабельным, у него есть стратегия, которая в простом случае может показаться ненужной. Да, можно использовать root[n][m]
.
- strcmp, похоже, не работает
- Хранение значений широты и долготы в виде символов с заданной точностью
- Массив float в строку, разделенную запятыми
- Чтение из SPIFFS - Как лучше всего работать со строковым (или char) массивом с неопределенной длиной?
- Как преобразовать строку в шестнадцатеричный массив
- Как отсортировать строку с числом по возрастанию
- Прокрутка текста I2C
- Удаление нежелательных символов из типа char