Как преобразовать сериализованную строку JSON обратно в объект JSON?
Как преобразовать строку JSON, например
{"f0":100,"f1":100,"f2":100}
Это то, что я получаю от своей стороны esp01 от связи I2C
Теперь я хочу ,чтобы он вернулся к моим боковым переменным Arduino int f0, int f1 ,int f2
Но пример, показанный на веб-сайте, использует другой сериализованный JSON
Показанный пример,
char json[] = "{\"датчик\":\"gps\",\"время\":1351824120,\"данные\":[48.756080,2.302038]}";
Могу ли я преобразовать данные, полученные от I2C-связи, для использования в методе deserializeJson(jsonobj, stringofdata)
Коммуникационная сторона I2C arduino выглядит следующим образом:
void receiveEvent(size_t howMany) {
String datain = "";
while (0 < Wire.available()) {
char c = Wire.read();
datain += c;
}
Serial.println(datain);
//будьте осторожны, нельзя отправить слишком много данных json I2C crash!
Serial.println(datain.length());
DynamicJsonDocument datajson(100);
if (deserializeJson(datajson, datain)) {
Serial.print("deserialization ok ");
digitalWrite(13, HIGH);
delay(250);
digitalWrite(13, LOW);
f0 = datajson["f0"];
f1 = datajson["f1"];
f2 = datajson["f2"];
Serial.println(String(f0) + " " + String(f1) + " " + String(f2));
}
}
В последовательном мониторе я вижу только это десериализация не работала
{"f0":0,"f1":0,"f2":0}
22
@Avon97, 👍1
Обсуждение1 ответ
Лучший ответ:
Ошибка, которую я сделал, заключалась в том, что deserializeJson(datajson, datain)
дает логическое значение как true
для правильной десериализации, но accually это дает объект DeserializationError err
, поэтому нужно проверить, нет ли ошибки таким образом
Новый кодекс
// нужно ! здесь
if (!deserializeJson(datajson, datain)) {
Serial.println("yay it worked");
Serial.print("deserialization ok ");
digitalWrite(13, HIGH);
delay(250);
digitalWrite(13, LOW);
f0 = datajson["f0"];
f1 = datajson["f1"];
f2 = datajson["f2"];
Serial.print(f0);
Serial.print(" ");
Serial.print(f1);
Serial.print(" ");
Serial.println(f2);
//также проверено таким образом, и это тоже работает
Serial.println(String(f0) + " " + String(f1) + " " + String(f2));
} else {
// Я кодировал здесь, думая, что это логическое раньше
//ошибка
}
Для справки, [вот документация deserializeJson()
](https://arduinojson.org/v6/api/json/deserializejson/)., @Benoit Blanchon
- Как преобразовать строку в массив байтов
- Получение всех данных моего объекта JSON из Serial.read() сразу
- Последовательная связь от Arduino до ESP8266 NodeMCU работает, но от NodeMCU до Arduino не работает
- Строка JSON для Arduino WiFi версии 2
- Преобразование Float в int не работает прямо в методе с использованием varargs
- Пользовательская библиотека для Arduino для кодирования и декодирования веб-токенов JSON
- Назначение и управление цифровым выводом из строки
- Как отправить метод POST с JSON? Ардуино УНО R3 + SIM900
возвращаемое значение deserializeJson не является логическим., @Juraj
Вы не можете объединить строковые литералы (
" "
) с +. Это просто складывает адреса указателей вместе., @MajenkoЯ попробовал с
`DeserializationError error
error
` внутри условия if все еще не повезло, @Avon97Такие ошибки отладки:
`arduino if (err) { Serial.print (F ("deserializeJson () failed: ")) Serial.println(err.c_str()) } else { //ваш код }
``, @Nay Lin Aung@Juraj Я считаю, что вы почти ответили на мой вопрос, это не логическое значение, но, однако, оно работает как логическое значение, однако для правильной десериализации мне нужно взять обратное этому, это была моя ошибка, я сначала подумал, что дает логическое значение как правильную десериализацию, так как истинно его нет;, @Avon97