String ohne Anführungsstriche

Hallo zusammen.

Ich habe mir ein epaper Display geholt und spiele gerade damit rum. Ziel ist es von einem Server Daten zu holen, die das ESP32 Driver Board (Waveshare) auf dem epaper anzeigt. Soweit funktioniert das ganz gut. Die Daten kommen per JSON und werden per 'JSON.parse' geparsed.
Mein Problem ist, das die Anführungsstriche (vorn und hinten) im String bleiben und auch angezeigt werden. Das ist natürlich "unschön".

Daher meine Frage: Wie kriege ich die Anführungsstriche aus den Strings raus?

Beispiel-Payload vom Server:

{"time":"10:12:39","date":"22.05.2023"}

(Test)Codefragment der das JSON parsed:

  if (WiFi.waitForConnectResult() == WL_CONNECTED) {
    HTTPClient http;
    http.begin(serverName); //Specify the URL
    int httpCode = http.GET();                                        //Make the request
  
    if (httpCode > 0) { //Check for the returning code
        payload = http.getString();
        Serial.println(httpCode);
        Serial.println(payload);
      }
  
    else {
      display.setFont(&FreeSansBold24pt7b);
      display.setTextColor(GxEPD_RED);
      y = y + 30;
      display.setCursor(x, y);
      display.print("Error on HTTP request");
      Serial.println("Error on HTTP request");
    }
    http.end(); //Free the resources

    JSONVar myObject = JSON.parse(payload);
    Serial.println(myObject);

    // JSON.typeof(jsonVar) can be used to get the type of the var
    if (JSON.typeof(myObject) == "undefined") {
      display.setFont(&FreeSansBold24pt7b);
      display.setTextColor(GxEPD_RED);
      y = y + 30;
      display.setCursor(x, y);
      display.print("JSON undefined");
    } else {
      Serial.print("JSON object = ");
      Serial.println(myObject);

      // myObject.keys() can be used to get an array of all the keys in the object
      JSONVar keys = myObject.keys();

      display.setFont(&FreeSans9pt7b);
      display.setTextColor(GxEPD_BLACK);
      display.setCursor(10, 20);
      display.print("Datum: " + (String)JSON.stringify(myObject["date"]));
      display.setCursor(10, 40);
      display.print("Zeit: " + JSON.stringify(myObject["time"]));

      for (int i = 0; i < keys.length(); i++) {
        JSONVar value = myObject[keys[i]];

        y = y + 20;
        display.setFont(&FreeSans9pt7b);
        display.setTextColor(GxEPD_BLACK);
        display.setCursor(30, y);
        display.print(keys[i]);
        display.setCursor(150, y);
        display.print(value);

        Serial.print(keys[i]);
        Serial.print(" = ");
        Serial.println(value);
      }
    }
  } else {
    y = y + 60;
    display.setFont(&FreeSansBold24pt7b);
    display.setTextColor(GxEPD_RED);
    display.setCursor(50, y);
    display.print("WiFi Disconnected");
  }

Angezeigt wird :

Datum: "22.05.2023"

Vielen Dank schon mal.

Meine Frage:
Warum sorgst du dafür, das sie da drin sind?
Wenn du das lässt, ......

Wenn du auf der Serverseite erst gar keine Anführungszeichen dazufügst sondern weglässt wäre das in der Tat die eleganteste Lösung.

Wenn du das serverseitig nicht ändern kannst, dann musste wohl oder Übel die Daten aus der

JSONVar myObject = JSON.parse(payload);

erst mal jeden Einzelbereich einen array of char zuweisen und dann kannst du das erste und das letzte Zeichen herauspicken.

zerlegen in
"10:12:39"
und
"22.05.2023"
dann
"10:12:39" einem array of char zuweisen
und dann eben bei der Ausgabe
myCharArray[0] weglassen
sondern nur myCharArray[1]
bis
myCharArray[lengthOfString-2] // -1 weil index bei null beginnt - 1 weil letztes Zeichen ja das Anführungszeichen ist
ausgeben

oder eine function dazwischen hängen die Zeichen für Zeichen ausgibt
und die prüft ob es ein Anführungszeichen ist, nur ausgeben wenn es kein Anführungszeichen ist.

vgs

Nun, es ist hässlich, aber man kann sie loswerden...

Ihr habt mich nicht verstanden!
Ist es doch JSON.stringify() welches die Anführungszeichen da dran klebt.

Klarer:
Erst selber dran kleben, und dann jammern, dass sie da sind.....

Danke schon mal für eure Antworten.

Serverseitig ist schlecht, da ein String in einem JSON mit Anführungsstrichen umschlossen sein muss... meines wissens.

@combie
JSON.stringify() klebt die da dran? Ok, das ist interessant. Welche andere Lösung schlägst du vor um aus einem JSON Array Element ein String zu machen (ich muss es ja mit einem anderen String verbinden)?

Die im Manual vorgeschlagene Methode!

#include <ArduinoJson.h>

#include <Streaming.h> // die Lib findest du selber ;-)
Print &cout = Serial; // cout Emulation für "Arme"



void setup() 
{
  Serial.begin(9600);
  cout << F("Start: ") << F(__FILE__) << endl;


  DynamicJsonDocument doc(1024);

  String input {R"json( {"time":"10:12:39","date":"22.05.2023"} )json"};

  
  deserializeJson(doc,input);

  cout << F("time: ") << doc["time"].as<String>() << endl;
  cout << F("date: ") << doc["date"].as<String>() << endl;

}

void loop() 
{

}

Wenn das Display die Standardmethode print kann
dann kann man doch ganz simpel

display.print("Datum: "); 
display.print( String (X)  );
// wobei dann "X" = JSON.hol_den_teil_raus(myObject["date"])); ist

print schreibt an aktueller Position der Zeile weiter
statt

print("123");

könnte man auch

print("1");
print("2");
print("3");

programmieren. Das Ergebnis auf dem Display ist das gleiche
beides mal steht da "123"

vgs

ArduinoJson hatte ich zwischenzeitlich auch gefunden. Das funktioniert. Trotzdem Danke :slight_smile:

@StefanL38
Nein, in dem Fall nicht. Man muss den Cursor an eine bestimmte Position setzen. Setzt man keine neue, überschreibt der beim nächsten Print das letzte Print.

Dan ist das komische Display lib
die sollte anzeigen "1""2""3" :wink:

print(1);
print(2);
print(3);

ergibt : 123

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.