Hallo! Ich möchte ein json mit C auswerten. Beispiel: {"time":1622204790,"states":[["3c6668","DLH1TN ","Germany",1622204790,1622204790,9.0302,46.6846,11582.4,false,213.88,35 6.55,0,null,11864.34,"1000",false,0]} Ich wollte das in ein entsprechend großes char array einlesen. Zu Recht wird das 2te " als das Ende des Strings interpretiert und es gibt eine Fehlermeldung. Wie macht man das?
Attila C. schrieb: > Ich wollte das in ein entsprechend großes char array einlesen. Zu Recht > wird das 2te " als das Ende des Strings interpretiert und es gibt eine > Fehlermeldung. > > Wie macht man das? Du meinst vermutlich eigentlich nicht "einlesen", sondern dass du dieses char-Array mit einem String-Literal initialisieren möchtest, welches Anführungszeichen enthalten muss. Da muss man "escapen". Es gibt mehrere Möglichkeiten, dies zu tun, die kürzeste ist: mache aus jedem " im String ein
1 | \" |
. (Edit: [c]-Tag eingefügt, weil sonst der Backslash zumindest in der mobilen Darstellung nicht sichtbar ist. - Mod.)
:
Bearbeitet durch Moderator
Es ist ein Json. Da ich jenes nicht selber schreibe sondern von einer API erhalte kann ich es nicht umschreiben.
Attila C. schrieb: > Es ist ein Json. Da ich jenes nicht selber schreibe sondern von einer > API erhalte kann ich es nicht umschreiben. Dann beschreibe mal exakt, was du tun willst. Ist das C-Quellcode, der compiliert werden soll? Dann geht das einfach nicht. Willst du das wirklich einlesen, also irgendwie mit fgets() oder dergleichen? Dann interessieren die Quotes erstmal gar nicht.
In viele IDEs kannst du mit einem leeren String anfangen und dieses JSON Dokument dann über die Zwischenablage einfügen: char test[]=""; Anführungsstriche und Zeilenumbrüche werden dann von der IDE automatisch escaped.
Attila C. schrieb: > Hallo! > > Ich möchte ein json mit C auswerten. Beispiel: > > {"time":1622204790,"states":[["3c6668","DLH1TN > ","Germany",1622204790,1622204790,9.0302,46.6846,11582.4,false,213.88,35 6.55,0,null,11864.34,"1000",false,0]} Das mit dem escapen ist ja schon erklärt worden. Aber soweit ich das sehe ist das Zeugs sowieso kaputt, weil der Wert von "states" (ein Array) mit zwei eckigen Klammern anfängt wo nur eine sein sollte. Ich würde mir erstmal ein ordentliches API zur Lieferung dieser Daten suchen, sonst hat man nur begrenzt Spass damit...
Attila C. schrieb: > Es ist ein Json. Da ich jenes nicht selber schreibe sondern von einer > API erhalte kann ich es nicht umschreiben. Das betrifft Dich doch nur dann, wenn Du das Ergebnis der API in einen C-Quellcode übernehmen willst. Wenn Du es in ein String "einliest", ist das Wumpe. Es sollte nur kein NULL enthalten sein.
Attila C. schrieb: > Ich wollte das in ein entsprechend großes char array einlesen. Zu Recht > wird das 2te " als das Ende des Strings interpretiert und es gibt eine > Fehlermeldung. Warum eigentlich zu Recht? man kann doch mit fgets(...) alles einlesen. Auch z.B. Zeilen wie
1 | /* auch das wird eingelesen */ "und" "das" "erst" "recht" |
Das JSON ist nicht valid... https://jsonlint.com/ kann man hier prüfen. Dein Problem ist das Object States welchen ein Array enthält und dieses Array ein weiteres Array. Mehrdimensionale Arrays sind im JSON möglich, aber nicht so... Alle Zeichen die in der c Funktion Verwendung finden müssen entwertet werden.. Andererseits müssen auch alle Zeichen die dein JSON zerstören ebenfalls beim ausgeben entwendet werden.
:
Bearbeitet durch User
Marco H. schrieb: > Mehrdimensionale Arrays sind im JSON möglich, aber nicht so... ähm wie meinen?
1 | [[0]] |
ist absolut valides json. beim beispiel im ersten beitrag ist ein array nicht geschlossen. ja, ist invalid aber weil das array nicht abgeschlossen ist...
Attila C. schrieb: > Ich möchte ein json mit C auswerten. Beispiel: > > {"time":1622204790,"states":[["3c6668","DLH1TN > ","Germany",1622204790,1622204790,9.0302,46.6846,11582.4,false,213.88,35 > 6.55,0,null,11864.34,"1000",false,0]} > > Ich wollte das in ein entsprechend großes char array einlesen. Zu Recht > wird das 2te " als das Ende des Strings interpretiert und es gibt eine > Fehlermeldung. > > Wie macht man das? Hallo Attila, die Auswertung von Json in C ist problemlos möglich. Die Beschreibung deines Problems ist aber sehr schwer zu verstehen. Zum einen ist dein Json-Beispiel kein gültiges Json. Aber noch schwerer zu verstehen ist der zweite Teil, wo du sagst, dass das zweite Anführungszeichen als Ende des Strings interpretiert wird. Anführungszeichen werden in C zur Laufzeit nicht als Ende eines Strings interpretiert; sie werden im Quellcode für Anfang und Ende von String-Literalen benutzt und dann vom Compiler interpretiert. Um dir helfen zu können solltest du dein Problem noch mal genauer beschreiben. LG, Sebastian
Also: Das mit dem Json hat sich erledigt, ich habe so viele dämliche Fehler gemacht dass es mir zu peinlich ist sie hier zu beschreiben. Dennoch: Wenn ich hier: https://www.onlinegdb.com/online_c_compiler Diesen Code eingebe: #include <stdio.h> char[20] = "abc"123"ABC" int main() { printf("Hello World"); return 0; } Kommt: Compilation failed due to following error(s). char[20] = "abc"123"ABC" ^
Auuuaaaaaaa! So jetzt nochmal: char c[] = "abc"123"ABC"; int main() { printf("Hello World"); return 0; } Der Error: char c[] = "abc"123"ABC"; ^~~
Attila C. schrieb: > ich habe so viele dämliche Fehler gemacht Und hier gleich noch einen. Hinweis: Variablen Typ dann Namen. Attila C. schrieb: > Auuuaaaaaaa! So jetzt nochmal Berichterstattungen sind schön, aber hier erwarten wir Fragen. Ich sehe keine Frage.
Hallo da und dort: Wie bewegt man das char array dazu die Gänsefüßchen innerhalb von Anfangs und End Gänsefüßchen einzulesen?
Attila C. schrieb: > Hallo da und dort: Wie bewegt man das char array dazu die Gänsefüßchen > innerhalb von Anfangs und End Gänsefüßchen einzulesen? Das ist kein EINLESEN das nennt man Compilieren. Das was du willst gibt die Syntax nicht her.
Attila C. schrieb: > Wie bewegt man das char array dazu die Gänsefüßchen > innerhalb von Anfangs und End Gänsefüßchen einzulesen? Abgesehen von deine Verständnisproblemen zu "einlesen" hat dir c-hater bereits die Lösung genannt. c-hater schrieb: > Da muss man "escapen".
Attila C. schrieb: > Hallo da und dort: Wie bewegt man das char array dazu die Gänsefüßchen > innerhalb von Anfangs und End Gänsefüßchen einzulesen? Wie oben genannt: mit escaping
1 | char c[] = "abc\"123\"ABC"; |
Das war gleich die allererste Antwort. Aber das „einlesen“ hat viele verwirrt.
Beitrag #6709888 wurde von einem Moderator gelöscht.
Beitrag #6709892 wurde von einem Moderator gelöscht.
Attila C. schrieb: > Vielen Dank Leute! Super. Aber wie gesagt, dieses escapen (also vor jedes doppelte Anführungszeichen einen backslash zu notieren) gilt nur für Stringliterale im C-Quellcode. Wenn du den Json-String zur Laufzeit über ein API einliest dann ist das nicht nötig! LG, Sebastian
Das erinnert mich an den Witz: Immer wenn ich standen sage, ruft ihr bitte laut Nein, habt ihr das verstanden? Nein!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.