Bene: JSON parsen Problem mit Form-Tag

Hallo Zusammen,

ich hole mir per HTTP-Request verschiedene HTML-Daten in einem assoziativen Array, dieses encode ich vorher mit PHP5 json_encode().

Im Javascript decode ich Sie wieder mit der eval Funktion.
Dies funktioniert einwandfrei.

Sobald ich aber ein Codestück mit Form-Tags verwende geht nichts mehr.

Der Server liefert mir dabei dies zurück:

{"html":"<!--// Search Service //-->\r\n\t\t\t\t\t \t\t<div>\r\n\t\t\t\t\t \t\t</div>\r\n\t\t\t\t\t \t\t<form><input type="hidden" name="PHPSESSID" value="8befc508f4486285a4cddde74f0d7ddd" /></form>"}

Der Fehler im Javascrip lautet:

missing } after property list
client.html (line 157)
({"html":"<!--// Search Service //-->\r\n\t\t\t\t\t \t\t<div>\r\n\t\t\t\t\t \t\t</div>\r\n\t\t\t\t\t \t\t<form><input type="hidden" name="PHPSESSID" value="8befc508f4486285a4cddde74f0d7ddd" /></form>"})

Hat jemand eine Idee woran dies liegen könnte und wie man das behebt?

Gruß,
Bene

  1. Der Fehler im Javascrip lautet:

    missing } after property list
    client.html (line 157)
    ({"html":"<!--// Search Service //-->\r\n\t\t\t\t\t \t\t<div>\r\n\t\t\t\t\t \t\t</div>\r\n\t\t\t\t\t \t\t<form><input type="hidden" name="PHPSESSID" value="8befc508f4486285a4cddde74f0d7ddd" /></form>"})

    Hat jemand eine Idee woran dies liegen könnte und wie man das behebt?

    Ja und ja.

    Hallo erstmal!

    Es liegt an den Anführungszeichen. JavaScript 'denkt', dass nach type=" Schluss ist.

    Du musst deinen HTML-Schnipsel mit htmlentities() aufbereiten, bevor du in an json_encode() übergibst.

    Gruss,
    Mathias

    1. Erstmal Danke für die Antwort.

      Hier mal meine neuen Ergebnisse:

      wenn ich den HTML-Code vor dem json_encode() mit htmlentities() aufbereite, funktioniert die übergabe richtig.

      Auf dem Client wird mir aber nicht mehr als HTML-Dargestellt, sondern ich sehe eine Seite die den Quelltext selbst enthält.

      Ich nehme an das ich die HTML-Entities vor dem Einbinden auf der Seite wieder "zurückwandeln" muss. Habe aber für Javascript keine entsprechende Funktion gefunden.

      ---

      Mein HTML-Code enthält übrigens das Hidden-Field mit der Session-ID
      garnicht, dieses wird wohl von der Funktion json_encode() eingefügt??
      Was ja ganz schon Banane wäre...

      Hier mal zum nachvollziehen:
      [code lang=php]
      /* create structure */
      $this->html =  '<!--// Search Service //-->
               <div>
        </div>
        <form></form>';

      /* create data array */
      $data_array = array ('html' => $this->html);

      /* encode data array to json */
      $encoded_data = json_encode($data_array);
      [/code}

      1. hi,

        wenn ich den HTML-Code vor dem json_encode() mit htmlentities() aufbereite, funktioniert die übergabe richtig.

        Auf dem Client wird mir aber nicht mehr als HTML-Dargestellt, sondern ich sehe eine Seite die den Quelltext selbst enthält.

        Ich nehme an das ich die HTML-Entities vor dem Einbinden auf der Seite wieder "zurückwandeln" muss. Habe aber für Javascript keine entsprechende Funktion gefunden.

        Warum maskierst du die Anführungszeichen nicht einfach - durch einen vorangestellten Backslash?

        Mein HTML-Code enthält übrigens das Hidden-Field mit der Session-ID
        garnicht, dieses wird wohl von der Funktion json_encode() eingefügt??

        Nein, wenn dann vermutlich eher vom Session-Mechanismus von PHP.

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
        1. hi,

          Warum maskierst du die Anführungszeichen nicht einfach - durch einen vorangestellten Backslash?

          OK, zugegeben - die richtige Frage müsste eigentlich lauten:

          Warum macht die Funktion json_encode() dies nicht gleich selber?

          (Denn wenn sie ungültigen JS-Code erzeugt, ist sie als fehlerhaft zu betrachten.)

          gruß,
          wahsaga

          --
          /voodoo.css:
          #GeorgeWBush { position:absolute; bottom:-6ft; }
          1. OK, zugegeben - die richtige Frage müsste eigentlich lauten:

            Warum macht die Funktion json_encode() dies nicht gleich selber?

            Weil es ein Bug ist?

            (Denn wenn sie ungültigen JS-Code erzeugt, ist sie als fehlerhaft zu betrachten.)

            Dabei ist http://www.json.org/ doch eigentlich sehr aussagekräftig, was das Escaping angeht.

            1. hi,

              Warum macht die Funktion json_encode() dies nicht gleich selber?

              Weil es ein Bug ist?

              Ja, sagte ich doch direkt im nächsten Satz:

              (Denn wenn sie ungültigen JS-Code erzeugt, ist sie als fehlerhaft zu betrachten.)

              gruß,
              wahsaga

              --
              /voodoo.css:
              #GeorgeWBush { position:absolute; bottom:-6ft; }
          2. hi,

            Warum maskierst du die Anführungszeichen nicht einfach - durch einen vorangestellten Backslash?

            Würde ich ja gerne tun, aber da die Anführungszeichen ja erst nach dem Ausführen von json_encode() auftreten. Bleiben diese davon unberührt.

            Warum fügt PHP-Überhaupt eine SessionID ein, eigentlich sollte das doch wie "normaler" Text behandelt werden...??

            Naja, ich werde wohl wieder auf eine andere JSON-Parser-Klasse zurückgreifen. Diese läuft dann auch auf Systemen < PHP5.

            Gruß,
            Bene