Ankündigung

Einklappen
Keine Ankündigung bisher.

Richtiges encodieren einer JSON-Datei für jQuery

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Richtiges encodieren einer JSON-Datei für jQuery

    Hi,

    ich hab ein encoding Problem.
    Um im TinyMCE eine Linkliste zu erstellen, gibt es die Möglichkeit, eine JSON-Datei zu übergeben. Das habe ich in meinem CMS (Eigenentwicklung) gemacht und es funktionierte einige Jahre.
    Jetzt gab es ein Update von TinyMCE, und nun gibt es die Fehlermeldung
    "Unexpected token t in JSON at position 3". Position 3 ist der erste Buchstabe der Json-Datei:
    Code:
    [
    {title: "Articles", menu: [
    {title: "Privacy Policy", value: 'm.php?sid=11'},
    {title: "Legal Disclosure", value: 'm.php?sid=4'}
    ]},
    …
    ]
    Hier
    https://stackoverflow.com/questions/14432165/uncaught-syntaxerror-unexpected-token-with-json-parse
    habe ich was interessantes darüber gefunden:

    Let's say you know it's valid JSON but your are still getting this...
    In that case it's likely that there are hidden/special characters in the string from whatever source your getting them. When you paste into a validator, they are lost - but in the string they are still there. Those chars, while invisible, will break JSON.parse()
    If s is your raw JSON, then clean it up with:

    Code:
    // preserve newlines, etc - use valid JSON
    s = s.replace(/\\n/g, "\\n") 
                   .replace(/\\'/g, "\\'")
                   .replace(/\\"/g, '\\"')
                   .replace(/\\&/g, "\\&")
                   .replace(/\\r/g, "\\r")
                   .replace(/\\t/g, "\\t")
                   .replace(/\\b/g, "\\b")
                   .replace(/\\f/g, "\\f");
    // remove non-printable and other non-valid JSON chars
    s = s.replace(/[\u0000-\u0019]+/g,"");
    var o = JSON.parse(s);
    Ich würde nun aber gerne dieses innerhalb von PHP machen, da ich den JS-Code nicht in TinyMCE reinbekomme.
    Bislang ist die Ausgabe am Ende meiner PHP-JSON-Datei dieses:
    PHP-Code:
    header('Content-Type: application/json; charset=UTF-8');
    echo 
    $json
    Kann mir jemand bei der richtigen Codierung helfen?


  • #2
    Warum nicht einfach JSON.stringify() verwenden? An einem kaputten JSON-String herumzudoktorn ist ja geradezu eine Einladung für noch mehr Fehler.

    Und mit PHP hat das gar nichts zu tun. Wenn du schon an PHP kaputte Daten übergibst, sollte der Fehler davor behoben werden. PHP ist die falsche Stelle. Das wäre so, als würdest du jedesmal die Feuerwehr rufen, statt deinen Herd auszumachen. Der Schaden ist da schon entstanden.

    Kommentar


    • #3
      json_encode() benutzen?
      Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

      Kommentar


      • #4
        json_encode() war mit das erste, aber das hat keine Veränderung gebracht.

        Zitat von hellbringer Beitrag anzeigen
        Warum nicht einfach JSON.stringify() verwenden? An einem kaputten JSON-String herumzudoktorn ist ja geradezu eine Einladung für noch mehr Fehler.

        Und mit PHP hat das gar nichts zu tun. Wenn du schon an PHP kaputte Daten übergibst, sollte der Fehler davor behoben werden. PHP ist die falsche Stelle. Das wäre so, als würdest du jedesmal die Feuerwehr rufen, statt deinen Herd auszumachen. Der Schaden ist da schon entstanden.
        Ich übergebe nicht an PHP kaputte Daten, sondern an Javascript (bzw. TinyMCE und jQuery) eine Json-Datei, die seit Jahren korrekt ist. Rufe ich diese Json-Datei im Browser auf und kopiere alles, und füge das an der entsprechenden Stelle bei link_list ein, ist alles in Ordnung.
        Es ist genau wie im obigen Link beschrieben:
        In that case it's likely that there are hidden/special characters in the string from whatever source your getting them. When you paste into a validator, they are lost - but in the string they are still there. Those chars, while invisible, will break JSON.parse()

        In PHP werden unsichtbare Zeichen eingefügt, die ich Löschen muss.

        Kommentar


        • #5
          Zitat von uli123 Beitrag anzeigen
          Ich übergebe nicht an PHP kaputte Daten, sondern an Javascript (bzw. TinyMCE und jQuery) eine Json-Datei, die seit Jahren korrekt ist. Rufe ich diese Json-Datei im Browser auf und kopiere alles, und füge das an der entsprechenden Stelle bei link_list ein, ist alles in Ordnung.
          Es ist genau wie im obigen Link beschrieben:
          In that case it's likely that there are hidden/special characters in the string from whatever source your getting them. When you paste into a validator, they are lost - but in the string they are still there. Those chars, while invisible, will break JSON.parse()
          Warum steht in einer JSON-Datei ein kaputter JSON-Wert? So weit sollte es erst gar nicht kommen und der Fehler davor sollte behoben werden.

          Zitat von uli123 Beitrag anzeigen
          In PHP werden unsichtbare Zeichen eingefügt, die ich Löschen muss.
          Der Satz ergibt keinen Sinn. Was heißt "in PHP"? Durch Zauberei, oder wie? Von alleine passiert nichts.

          Kommentar


          • #6
            Zitat von hellbringer Beitrag anzeigen
            Warum steht in einer JSON-Datei ein kaputter JSON-Wert?
            Wo habe ich das geschrieben? Ich habe doch geschrieben, dass die JSON-Datei NICHT kaputt ist. Welchen kaputten Wert meinst Du?
            Zitat von hellbringer Beitrag anzeigen
            Der Satz ergibt keinen Sinn. Was heißt "in PHP"? Durch Zauberei, oder wie? Von alleine passiert nichts.

            Naja, stammt ja nicht von mir. Ich hatte ja zitiert, "
            it's likely that there are hidden/special characters in the string".
            Ich gehe also davon aus, wenn jQuery sagt, da ist was (unsichtbares) und der andere Poster auch sagt, da sind hidden/special Zeichen, dass da auch was ist. Wieso sollte die Datei bei Copy/Paste akzeptiert werden, aber gleicher Inhalt über PHP direkt nicht?

            Kommentar


            • #7
              Zitat von uli123 Beitrag anzeigen
              Wieso sollte die Datei bei Copy/Paste akzeptiert werden, aber gleicher Inhalt über PHP direkt nicht?
              Liegt wohl am fehlerhaften PHP-Code. Der Fehler ist jedenfalls nicht in den gezeigten 2 Zeilen, sondern wo anders. Oder die JSON-Datei ist defekt.

              Und Copy/Paste ist kein brauchbares Mittel um Fehler zu finden, da schon alleine durch Copy/Paste Zeichen verändert werden können. Du solltest die JSON-Datei mal direkt validieren.

              Kommentar


              • #8
                Zitat von uli123 Beitrag anzeigen
                Code:
                [
                {title: "Articles", menu: [
                {title: "Privacy Policy", value: 'm.php?sid=11'},
                {title: "Legal Disclosure", value: 'm.php?sid=4'}
                ]},
                …
                ]
                Ich habe dein JSON mal mit https://jsonlint.com validiert.
                Folgender Code:
                Code:
                [
                {title: "Articles", menu: [
                {title: "Privacy Policy", value: 'm.php?sid=11'},
                {title: "Legal Disclosure", value: 'm.php?sid=4'}
                ]}
                ]
                Führt zu dieser Meldung:
                Error: Parse error on line 1: { title: "Articles", --^ Expecting 'STRING', '}', got 'undefined'

                Dieser Code:
                Code:
                [{
                    "title": "Articles",
                    "menu": [{
                            "title": "Privacy Policy",
                            "value": "m.php?sid=11"
                        },
                        {
                            "title": "Legal Disclosure",
                            "value": "m.php?sid=4"
                        }
                    ]
                }]
                Wird als valide angesehen ...

                Kommentar


                • #9
                  Die gezeigten 2 Zeilen waren natürlich nicht die ganze Datei und nur bedingt aussagekräftig. Aber, wie mehrfach gesagt, ist die Struktur der Datei in Ordnung, nichts ist defekt.

                  In TinyMCE kann ich entweder eine Datei als link_list angeben, oder hardcodiert komplett als Text.
                  Habe nun folgendes gemacht:
                  Nun habe ich nicht die PHP-Datei angegeben (die über Echo ausgibt), sondern habe alles in eine Variable geschrieben und diese dann statt der PHP-Datei eingetragen.
                  Code:
                  Vorher:
                  in PHP
                  header('Content-Type: application/json; charset=UTF-8'); echo $json;
                  in JS:
                  tinymce.init({ … link_list: "jsonlinklist.php"
                  Jetzt: in JS
                  tinymce.init({
                  ...
                  link_list: \".$json.\"
                  Der entstandene Jacascript-Code ist dadurch natürlich riesig, aber der Inhalt ist identisch mit der Angabe der Datei. Nun funktioniert alles. Also nochmal: Json ist in Ordnung, PHP ist in Ordnung, nur die Ausgabe via Echo verändert die Codierung.
                  Bei >1000 Seiten will ich aber nicht so ein Monster ständig laden und würde gerne wieder auf die empfohlene Weise mit der Datei gehen, die, wie gesagt, viele Jahre unverändert auch mit TinyMCE funktionierte.

                  Kommentar


                  • #10
                    @see https://www.json.org/ - JSON Sezifikation

                    Das Snippet aus dem ersten Beitrag ist nicht(!) valide.
                    Strings gehören in Anführungszeichen, das gilt auch für Bezeichner/Labels.
                    Das ist der Grun, warum dir das Ganze ins Gesicht springt.

                    Unter Umständen ist dein "verstecktes Zeichen" ja ein BOM in der JSON Datei ... aber nur eine Vermutung.

                    zu sähe eine korrigiertes Snippet des JSON aus:
                    Code:
                     
                     [ {"title": "Articles", "menu": [ {"title": "Privacy Policy", "value": "m.php?sid=11"}, {"title": "Legal Disclosure", "value": "m.php?sid=4"} ]}, … ]
                    Wenn du JSON encode benutzt, dann zum Beispiel so:
                    PHP-Code:

                    $array 
                    = array(
                        
                    "title""Articles",
                        
                    "menu": array(
                            
                    "title""Privacy Policy",
                            
                    "value""m.php?sid=11"
                        
                    ),
                        array(
                            
                    "title""Legal Disclosure",
                            
                    "value""m.php?sid=4",
                        ),
                    );

                    $json json_encode($array); 
                    Den ganzen Krempel mit dem Replacen im JS solltest du dann nicht brauchen.

                    Kommentar


                    • #11
                      Zitat von uli123 Beitrag anzeigen
                      Json ist in Ordnung
                      Nein definitiv nicht!

                      Kommentar


                      • #12
                        Mmm, ok, ich programmier die Erstellung der Json-Datei nochmal komplett neu.
                        Vielen Dank bis hierhin und schönes Wochenende!

                        Kommentar


                        • #13
                          Zitat von uli123 Beitrag anzeigen
                          PHP ist in Ordnung, nur die Ausgabe via Echo verändert die Codierung.
                          Nein, tut es nicht. Du bist am falschen Dampfer. Ein echo verändert keine Ausgabe.

                          Kommentar


                          • #14
                            Zitat von Gnom42 Beitrag anzeigen
                            Strings gehören in Anführungszeichen, das gilt auch für Bezeichner/Labels.
                            Ich war wirklich auf dem falschen Dampfer! Da es all die Jahre ohne Anführungszeichen geklappt hat (alte TinyMCE waren ev. toleranter programmiert) war ich felsenfest davon überzeugt, dass mein JSON richtig ist.

                            Den ganzen Tag habe ich in die falsche Richtung recherchiert.

                            Danke, dass Ihr so hartnäckig geblieben seit und mich und den Thread nicht einfach ignoriert habt!
                            Ihr habt Euch das sonnige Wochenende wirklich verdient! Nochmal, Danke!

                            Kommentar

                            Lädt...
                            X