Ошибка синтаксического анализа библиотеки ArduinoJson
Я пытаюсь получить сообщение JSON mqtt, полученное в ESP32.
void mqttMsgCallback(char* topic, byte* payload, unsigned int length) {
payload[length] = '\0';
String _message = String((char*)payload);
String _topic = String(topic);
if (_topic.equals("Sys.GetInfo/"+getMacAddr()) == 1)
{
Serial.println("Message arrived for sys.GetInfo");
StaticJsonDocument <256> msg1;
Serial.println(_message);
deserializeJson(msg1,_message);
String callbackTopic = msg1["callbackTopic"];
Serial.println(callbackTopic);
}
}
Проблема в том, что когда я публикую mosquitto_pub-t "Sys.GetInfo/2462ABFC2CD0" -m "{"Обратный вызов" : "1234"}"
, он хорошо работает, как обратный вызов, как 1234.
но когда я публикую mosquitto_pub-t "Sys.GetInfo/2462ABFC2CD0" -m "{"callbackTopic" : "xyz"}"
, он выводит значение callbackTopic как null.
Пожалуйста, укажите мне, если я что-то упустил.
Arduino версии 1.8.15 АрдуиноЙсон : 6.18.2 Борад : ESP32
Спасибо
@Abhishek bhatia, 👍2
Обсуждение2 ответа
Лучший ответ:
Ваша оболочка обнажает "изнутри строки". Если вы выполните команду:
$ echo "{"callbackTopic" : "xyz"}"
вы получаете:
{callbackTopic : xyz}
итак, вы видите, что все цитаты оборваны. xyz
-это не то, что может разобрать Ардуиноджсон. Но 1234
-это, так что с вычеркнутыми кавычками он все еще считается действительным.
Вам нужно убедиться, что цитаты не удалены. Есть два способа сделать это: избежать их или заключить строку в одинарные кавычки, что дает более "буквальную" интерпретацию содержимого, чем двойные кавычки:
Побег:
"{\"callbackTopic\" : \"xyz\"}"
Одинарные кавычки:
'{"callbackTopic" : "xyz"}'
Любой из них при использовании в качестве параметра для команды работает следующим образом:
$ echo '{"callbackTopic" : "xyz"}'
{"callbackTopic" : "xyz"}
Чтобы разобрать ArduinoJSON, нужно просто
String JSONpayload = "some JSON here";
StaticJsonDocument <512> geoLocationInfoJson;
DeserializationError error = deserializeJson(geoLocationInfoJson, JSONpayload);
if (error) {
this->mserial->printStrln("Error deserializing JSON");
}
Чтобы использовать значения в StaticJsonDocument
, сначала необходимо
if ( geoLocationInfoJson.isNull() == true ){
String dataStr="NULL geoLocation data.\n";
Serial.print( dataStr);
return true;
}
Далее необходимо проверить, существует ли ключ. Если TRUE, то обязательно сначала получить желаемое значение в соответствующий тип данных, как показано ниже, и только после этого работать с ним, например, отправить его в виде строки сообщения BLE:
if(this->interface->geoLocationInfoJson.containsKey("lat")){
float lat = this->interface->geoLocationInfoJson["lat"];
dataStr += "Latitude: "+ String(lat,4) + "\n";
}
if(this->interface->geoLocationInfoJson.containsKey("lon")){
float lon = this->interface->geoLocationInfoJson["lon"];
dataStr += "Longitude: "+ String(lon,4) + "\n";
}
if(this->interface->geoLocationInfoJson.containsKey("regionName"))
dataStr += String(this->interface->geoLocationInfoJson["regionName"].as<char*>()) + ", ";
Полный код выше доступен в этом репозитории GitHub:
https://github.com/aeonSolutions/aeonlabs-ESP32-C-Base-Firmware -Библиотеки
на какой вопрос это отвечает?, @Juraj
Один из успешных анализов объекта arduinojson. И ключ доступа, пары значений, которые он содержит, @Miguel Silva
это не вопрос, заданный вверху этой страницы, @Juraj
Читай между строк ?, @Miguel Silva
существующий принятый ответ показывает, в чем была проблема, @Juraj
Как я уже говорил. Читай между строк., @Miguel Silva
- Публиковать данные json в mqtt
- Не могу скомпилировать .ino с помощью библиотеки ArduinoJson
- ESP32 в Arduino-IDE с FS.h и SPIFFS
- Программаторы для этой платы отсутствуют - Программирование ESP32 Cam с помощью Ardunio IDE
- Установка значения float до двух знаков после запятой
- ESP32-CAM первый: 0x8 TG1WDT_SYS_RESET загрузочный цикл
- esp32 Stack canary watchpoint срабатывает
- Преобразование byte* в int в Arduino
Проверьте возвращаемое значение
deserializeJson ()
, чтобы увидеть, может ли он даже проанализировать его как допустимый JSON. Возможно, вам нужно `{"callbackTopic" : "xyz"}" (одинарные кавычки снаружи), чтобы сохранить кавычки внутри., @Majenko@Majenko это работает, когда я публикую как ``{"callbackTopic" : "xyz"}"". Спасибо , почему сообщение с "" работает, когда значение "Обратный вызов" является числовым, @Abhishek bhatia
Вероятно, потому, что значение числовое. 1234 - допустимая "вещь", а xyz-нет. "xyz", однако, есть, и если ваша оболочка удаляет", потому что она не экранирована или не заключена в одинарные кавычки, то она не может анализировать "xyz"как допустимую "вещь"., @Majenko
полезная нагрузка[длина] = '\0';
откуда вы знаете, что доступна позиция длина + 1?, @Juraj