Как преобразовать сериализованную строку 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

, 👍1

Обсуждение

возвращаемое значение 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


1 ответ


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

2

Ошибка, которую я сделал, заключалась в том, что 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