Steffen Flämig: JSON Daten nicht wohlgeformt

Hallo,

in einer Ajax Anwendung übergebe ich die in einem Perl Script generierten Daten per JSON.

print "{'foo': [{'bar': '0815'}]}";

(print "{'bar':'0815'}"; ergibt den gleichen Fehler)

Die Daten kann ich im Clientseitigen JavaScript auch auslesen, (fast) alles funktioniert wunderbar. Nur die Fehlerkonsole des Firefox füllt sich mit den folgenden Meldungen:

Fehler: nicht wohlgeformt
Quelldatei: http://www.meineDomain.de/cgi-bin/ajaxTest_1.pl
Zeile: 1, Spalte: 1
Quelltext:
{'foo': [{'bar': '0815'}]}^
  ^

Auch auf json.org habe ich nicht herausgefunden was ich falsch mache.
An was könnte das liegen?

Gruß
Steffen

  1. Moin!

    Fehler: nicht wohlgeformt
    Quelldatei: http://www.meineDomain.de/cgi-bin/ajaxTest_1.pl
    Zeile: 1, Spalte: 1
    Quelltext:
    {'foo': [{'bar': '0815'}]}^
      ^

    Wenn du diesen String mal mit der Vorlage auf http://www.json.org/ vergleichst, siehst du kleine, aber feine Unterschiede.

    Auch auf json.org habe ich nicht herausgefunden was ich falsch mache.
    An was könnte das liegen?

    "

    - Sven Rautenberg

    --
    "Love your nation - respect the others."
    1. Moin Sven!

      {'foo': [{'bar': '0815'}]}^
        ^

      Wenn du diesen String mal mit der Vorlage auf http://www.json.org/ vergleichst, siehst du kleine, aber feine Unterschiede.

      An was könnte das liegen?

      "

      Meinst Du die Verwendung von ' anstelle von " meinst?
      Das hatte ich in der Annahme gemacht JavaScript sie das _völlig_ egal.
      In Perl werden aber Ausdrück in " interpretiert, die in ' nicht. Das war für meine Ausgabe einfach einfacher.
      Aber egal, eine Änderung in:
      {"foo": [{"bar": "0815"}]}

      bringt dann dden Fehler:
      {"foo": [{"sid": "0815"}]}^
        ^

      Oder hast Du etwas anderes gemeint?

      Gruß
      Steffen

      1. Moin!

        {'foo': [{'bar': '0815'}]}^
          ^

        Wenn du diesen String mal mit der Vorlage auf http://www.json.org/ vergleichst, siehst du kleine, aber feine Unterschiede.

        An was könnte das liegen?

        "
        Meinst Du die Verwendung von ' anstelle von " meinst?

        Exakt.

        json.org spricht ausschließlich von " als Begrenzungszeichen. Muß einen Grund haben. Und sei es nur der, dass das im Standard so drinsteht.

        Das hatte ich in der Annahme gemacht JavaScript sie das _völlig_ egal.

        Javascript ist nicht die einzige Sprache, die JSON verarbeitet.

        Es gilt die Formel: Sei liberal in dem, was du akzeptierst, aber konservativ in dem, was du generierst.

        In Perl werden aber Ausdrück in " interpretiert, die in ' nicht. Das war für meine Ausgabe einfach einfacher.
        Aber egal, eine Änderung in:
        {"foo": [{"bar": "0815"}]}

        bringt dann dden Fehler:
        {"foo": [{"sid": "0815"}]}^
          ^

        Und was glaubst du, kann ich da jetzt noch untersuchen?

        Der Tipp mit falschen Begrenzern ist das einzige, was mir durch deine Infos aufgefallen ist. Gib mehr Infos.

        - Sven Rautenberg

        --
        "Love your nation - respect the others."
        1. Hallo,

          Der Tipp mit falschen Begrenzern ist das einzige, was mir durch deine Infos aufgefallen ist. Gib mehr Infos.

          Ich habe das Problem hier weitestgehend isoliert.
          Hier der Clientseitige code:

          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
            "http://www.w3.org/TR/html4/loose.dtd"><html>

          <head>
          <title>Test</title>
          <script type="text/javascript">
          var http_request = false;
          function test()
          {
           var query = "";
           http_request = false;
           if (window.XMLHttpRequest)
           { // Mozilla, Safari,...
            http_request = new XMLHttpRequest();
            if (http_request.overrideMimeType)
            {
             http_request.overrideMimeType('text/xml');
            }
           } else
           if (window.ActiveXObject)
            { // IE
             try
             {
              http_request = new ActiveXObject("Msxml2.XMLHTTP");
             } catch (e)
             {
              try
             {
              http_request = new ActiveXObject("Microsoft.XMLHTTP");
             } catch (e) {}
            }
           }
           if (!http_request)
           {
            alert('Giving up :( Cannot create an XMLHTTP instance');
            return false;
           }
           http_request.onreadystatechange = alert("test");
           http_request.open('POST', 'http://www.floridee.de/cgi-bin/test/floridee2/ajaxTest_2.pl', true);
           http_request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
           http_request.send(query);
          }
          </script>

          </head>

          <body onLoad=test()>
          </body>
          </html>

          Und hier das Perl Script:
          #!/usr/local/bin/perl
          print "Content-type: text/html\n\n";
          print '{"foo": [{"sid": "0815"}]}';

          Das ganze ergibt in der Firefox Fehlerkonsole:
          Fehler: nicht wohlgeformt
          Quelldatei: http://www.floridee.de/cgi-bin/test/floridee2/ajaxTest_2.pl
          Zeile: 1, Spalte: 1
          Quelltext:
          {"foo": [{"sid": "0815"}]}^

          Gruß
          Steffen

          1. Hallo,

            Und hier das Perl Script:
            #!/usr/local/bin/perl
            print "Content-type: text/html\n\n";

            auch die Änderung in text/plain hat nichts gebracht,

            print '{"foo": [{"sid": "0815"}]}';

            Das ganze ergibt in der Firefox Fehlerkonsole:
            Fehler: nicht wohlgeformt
            Quelldatei: http://www.floridee.de/cgi-bin/test/floridee2/ajaxTest_2.pl
            Zeile: 1, Spalte: 1
            Quelltext:
            {"foo": [{"sid": "0815"}]}^

            Gruß
            Steffen

          2. Hallo,

            Ich habe das Problem hier weitestgehend isoliert.
            Hier der Clientseitige code:

            ...

            if (http_request.overrideMimeType)
              {
               http_request.overrideMimeType('text/xml');

            Du sagst hier explizit, die response vom Server soll als text/xml betrachtet werden, egal, was immer der sendet.

            Und hier das Perl Script:
            #!/usr/local/bin/perl
            print "Content-type: text/html\n\n";
            print '{"foo": [{"sid": "0815"}]}';

            Das ganze ergibt in der Firefox Fehlerkonsole:
            Fehler: nicht wohlgeformt
            Quelldatei: http://www.floridee.de/cgi-bin/test/floridee2/ajaxTest_2.pl
            Zeile: 1, Spalte: 1
            Quelltext:
            {"foo": [{"sid": "0815"}]}^

            Das ist allerdings kein XML, schon gar kein wohlgeformtes.

            Nimm das overrideMimeType('text/xml') heraus und lass das Perl text/plain senden.

            viele Grüße

            Axel

            1. lass das Perl text/plain senden.

              Oder text/json !?

              Tommi

              1. Hallo,

                Oder text/json !?

                Nein, text/json ist nicht definiert.

                Wenn, dann eher application/json. Allerdings müsste das dann erst mal in allen zu unterstützenden Browsern getestet werden. Grade mit den application Media Typen gibt es immer so einige Probleme.

                viele Grüße

                Axel

                1. Hallo,

                  Allerdings müsste das dann erst mal in allen zu unterstützenden Browsern getestet werden.

                  Der MIME-Typ ist doch ziemlich egal - was soll man da denn testen? Wenn man JSON mit einem XMLHttpRequest einliest und ein eval() über den responseText jagt, ist der MIME-Typ, mit dem das JSON gesendet wird, irrelevant.

                  Mathias

                  1. Hallo,

                    Der MIME-Typ ist doch ziemlich egal - was soll man da denn testen? Wenn man JSON mit einem XMLHttpRequest einliest und ein eval() über den responseText jagt, ist der MIME-Typ, mit dem das JSON gesendet wird, irrelevant.

                    Ja, aber eventuell ist der Media Type _vorher_ nicht egal, wie man an der "nicht wohlgeformt" Fehlermeldung des FireFox siehr, wenn dieser JSON als text/xml oder application/xml geliefert bekommt.

                    viele Grüße

                    Axel

          3. Hallo,

            http_request.onreadystatechange = alert("test");

            Da hast du einen Denkfehler. Das funktioniert so nicht.

            In der onreadystatechange-Eigenschaft musst du ein Funktionsobjekt speichern. Was du momentan machst: Du führst alert() zum Zeitpunkt dieser Zuweisung aus und speicherst den Rückgabewert von alert() in der Eigenschaft. Das ist Unsinn, denn alert() gibt nichts zurück. Damit hast du keinen readystatechange-Handler.

            Möglich wäre

            function readyStateHandler () {
               alert("test");
            }
            http_request.onreadystatechange = readyStateHandler;

            Oder gleichwertig mit einer Function-Expression bzw. namenlosen Funktion:

            http_request.onreadystatechange = function () {
               alert("test");
            };

            Mathias

            1. Hallo,

              http_request.onreadystatechange = alert("test");
              Da hast du einen Denkfehler. Das funktioniert so nicht.

              In der onreadystatechange-Eigenschaft musst du ein Funktionsobjekt speichern. Was du momentan machst: Du führst alert() zum Zeitpunkt dieser Zuweisung aus und speicherst den Rückgabewert von alert() in der Eigenschaft. Das ist Unsinn, denn alert() gibt nichts zurück. Damit hast du keinen readystatechange-Handler.

              Das ist nicht der Punkt.
              Ich habe das ganze Script auf ein Minimum zusammen gestutzt, so dass es gerade noch mein Problem zeigt.
              In "Wiklichkeit" steht dort natürlich nicht "alert..." sonder etwas anderes.
              Hir geht es nur um das Problem der "nicht wolhgeformten" Rückgabe vom Server.

              Gruß
              Steffen

          4. Tach.

            {"foo": [{"sid": "0815"}]}

            Ich habe JSON höchstens mal aus der Ferne gesehen. Mein Ansatz zum Debuggen wäre aber u. a. ein einfacheres Objekt als in deinem Beispiel. Probier es doch einmal mit {"foo": 42}. Funktioniert das?

            --
            Once is a mistake, twice is jazz.
  2. in einer Ajax Anwendung übergebe ich die in einem Perl Script generierten Daten per JSON.
    print "{'foo': [{'bar': '0815'}]}";

    Warum benutzt du nicht das Modul JSON.pm dafür? Auf dein Beispiel bezogen ergibt das:

    use JSON;  
    my $obj = { 'foo' => [ { 'bar' => '0815' } ] };  
    my $json = JSON->new;  
    print $json->objToJson($obj);
    

    Damit brauchst du dir um die korrekte Umwandlung des Objektes in JSON keinen Kopf mehr zu machen - eine Fehlerquelle weniger.

    Siechfred

    --
    Ich bin strenggenommen auch nur interessierter Laie. (molily)