Ошибка синтаксического анализа библиотеки 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

Спасибо

, 👍2

Обсуждение

Проверьте возвращаемое значение deserializeJson (), чтобы увидеть, может ли он даже проанализировать его как допустимый JSON. Возможно, вам нужно `{"callbackTopic" : "xyz"}" (одинарные кавычки снаружи), чтобы сохранить кавычки внутри., @Majenko

@Majenko это работает, когда я публикую как ``{"callbackTopic" : "xyz"}"". Спасибо , почему сообщение с "" работает, когда значение "Обратный вызов" является числовым, @Abhishek bhatia

Вероятно, потому, что значение числовое. 1234 - допустимая "вещь", а xyz-нет. "xyz", однако, есть, и если ваша оболочка удаляет", потому что она не экранирована или не заключена в одинарные кавычки, то она не может анализировать "xyz"как допустимую "вещь"., @Majenko

полезная нагрузка[длина] = '\0'; откуда вы знаете, что доступна позиция длина + 1?, @Juraj


2 ответа


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

2

Ваша оболочка обнажает "изнутри строки". Если вы выполните команду:

$ echo "{"callbackTopic" : "xyz"}"

вы получаете:

{callbackTopic : xyz}

итак, вы видите, что все цитаты оборваны. xyz-это не то, что может разобрать Ардуиноджсон. Но 1234-это, так что с вычеркнутыми кавычками он все еще считается действительным.

Вам нужно убедиться, что цитаты не удалены. Есть два способа сделать это: избежать их или заключить строку в одинарные кавычки, что дает более "буквальную" интерпретацию содержимого, чем двойные кавычки:

Побег:

"{\"callbackTopic\" : \"xyz\"}"

Одинарные кавычки:

'{"callbackTopic" : "xyz"}'

Любой из них при использовании в качестве параметра для команды работает следующим образом:

$ echo '{"callbackTopic" : "xyz"}'
{"callbackTopic" : "xyz"}
,

-1

Чтобы разобрать 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