Bernd: JSON oder XML?

Hallo zusammen,

ich beschäftige mich mit AJAX und steh grad vor der Frage ob mein Server JSON oder XML zurückschicken soll. Klar hängt das immer vom Problemkontext ab. Eines weiß ich aber jetzt schon: ich werde teilweise nicht-XML-konformen HTML code vom Server zum Client schicken müssen. Bei XML kann ich den in CDATA-Sections packen, aber was macht JSON da??? Vielleicht bin ich zu blöd, aber ich hab die Antwort darauf im Netz nicht gefunden...

Weiß sie einer von euch???

Falls ihr noch mögt, könnt ihr mir ja noch EURE allgemeine Präferenz mitteilen: JSON oder XML???

Danke,

Bernd

  1. Und nochwas: wenn ich folgendes XML empfange

    <test>
      <a>23</a>
      <b>was bin ich</b>
      <c><![CDATA[und was ich?]]></c>
      <d>2xxx3</d>
      <e>true</e>
    </test>

    und mittels JS-DOM-Methoden ([...].nodeValue / [...].data) parse, kann es sein dass der Typ der enthaltenen Daten IMMER String ist? Also z.B. <e>true</e> zu "true" anstatt true (JS) wird?

    Scheint so, wundert mich halt.

    Bernd

    1. Tach Bernd,

      kann es sein dass der Typ der enthaltenen Daten IMMER String ist? Also z.B. <e>true</e> zu "true" anstatt true (JS) wird?

      Im XML-Elementinhalt stehen Zeichendaten. Wandle diese ggf. mittels Boolean() um:

        
      var zeichenkette="true";  
      alert(!Boolean(zeichenkette)); // false
      

      Man liest sich,
      svg4you

      1. Im XML-Elementinhalt stehen Zeichendaten. Wandle diese ggf. mittels Boolean() um:

        aah, ok, danke.

      2. Hallo svg4you.

        kann es sein dass der Typ der enthaltenen Daten IMMER String ist? Also z.B. <e>true</e> zu "true" anstatt true (JS) wird?

        Im XML-Elementinhalt stehen Zeichendaten. Wandle diese ggf. mittels Boolean() um:

        var zeichenkette="true";
        alert(!Boolean(zeichenkette)); // false

          
        Was nicht allzu viel nützt:  
          
        ~~~javascript
        var zeichenkette="false";  
        alert(Boolean(zeichenkette)); // true
        

        Man müsste hier also erst „false“ durch einen Leerstring ersetzen, welcher dann bei der Umwandlung in den booleanschen Datentyp „false“ entspricht.

        Einen schönen Montag noch.

        Gruß, Mathias

        --
        ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)
        debian/rules
        1. Tach Mathias,

          Was nicht allzu viel nützt:

          var zeichenkette="false";

          alert(Boolean(zeichenkette)); // true

          
          >   
          > Man müsste hier also erst „false“ durch einen Leerstring ersetzen, welcher dann bei der Umwandlung in den booleanschen Datentyp „false“ entspricht.  
            
          Ja, stimmt. Alternativ so:  
            
          ~~~javascript
            
          var zeichenkette="true",test;  
          if(zeichenkette == "true" || zeichenkette == "false")test=eval(zeichenkette);  
          alert(test);
          

          Man liest sich,
          svg4you

          1. Hallo svg4you.

            Tach Mathias,

            Was nicht allzu viel nützt:

            var zeichenkette="false";

            alert(Boolean(zeichenkette)); // true

            
            > >   
            > > Man müsste hier also erst „false“ durch einen Leerstring ersetzen, welcher dann bei der Umwandlung in den booleanschen Datentyp „false“ entspricht.  
            >   
            > Ja, stimmt. Alternativ so:  
            >   
            > ~~~javascript
              
            
            > var zeichenkette="true",test;  
            > if(zeichenkette == "true" || zeichenkette == "false")test=eval(zeichenkette);  
            > alert(test);
            
            

            Oder so:

              
            var zeichenkette = "true";  
            var test = (zeichenkette == "true" ? true : false);  
              
            alert(test + " (" + typeof(test) + ")"); // true (boolean)
            

            (Du weißt doch, „eval is evil“.)

            Einen schönen Montag noch.

            Gruß, Mathias

            --
            ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)
            debian/rules
            1. Hallo nochmal.

              var zeichenkette = "true";
              var test = (zeichenkette == "true" ? true : false);

              alert(test + " (" + typeof(test) + ")"); // true (boolean)

                
              Wobei es der Sinnhaftigkeit wegen anders herum wohl besser ist:  
                
              ~~~javascript
              var zeichenkette = "true";  
              var test = (zeichenkette == "false" ? false : true);  
                
              alert(test + " (" + typeof(test) + ")"); // true (boolean)
              

              Schließlich führt von allen Zahlen dieser Welt und allen Zeichenketten nur jeweils eine einzige zu „false“.

              Einen schönen Montag noch.

              Gruß, Mathias

              --
              ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)
              debian/rules
  2. Hallo,

    ich werde teilweise nicht-XML-konformen HTML code vom Server zum Client schicken müssen.

    Auch wenn du diese Antwort wohl nicht erwartest:
    Dann sende es als text/html.

    Bei XML kann ich den in CDATA-Sections packen, aber was macht JSON da???

    { htmlcode : "<p>HTML-Code</p>" }

    Halte ich aber für unsinnig, wieso ein Format in ein weiteres packen?

    Falls ihr noch mögt, könnt ihr mir ja noch EURE allgemeine Präferenz mitteilen: JSON oder XML???

    Solange einem kein ECMAScript for XML zur Verfügung steht, sind Daten aus JSON-Strukturen einfacher zu extrahieren (vgl. simplexml in PHP). Und XML-DOM-Knoten kann man eh noch nicht direkt ins Dokument kopieren. Dafür kann man das XML-DOM eben mit allen Rafinessen durchlaufen, die das DOM bietet.

    Mathias

    1. Auch wenn du diese Antwort wohl nicht erwartest:
      Dann sende es als text/html.

      Erwartet hab ich sie nicht, gewusst dass es geht schon. Allerdings macht das in meinem Supersonderfall :-) nicht viel Sinn...

      { htmlcode : "<p>HTML-Code</p>" }

      Schon, aber mein Code wird z.B. so aussehen: <p onclick="doIt()">XXX</p>

      Fraglich ob der (anscheinende) Geschwindigkeitsvorteil von JSON gegenüber XML nicht dadurch verloren geht, dass ich vorher meinen Code immer escapen muss - sofern das für JSON überhaupt angenehm geht. Hab gesehen dass es dafür auch Java-Objekt gibt, nur nicht ob die das machen... Weißt du es?

      Halte ich aber für unsinnig, wieso ein Format in ein weiteres packen?

      Wie gesagt, "Supersonderfall"... ;-)

      Solange einem kein ECMAScript for XML zur Verfügung steht, sind Daten aus JSON-Strukturen einfacher zu extrahieren (vgl. simplexml in PHP). Und XML-DOM-Knoten kann man eh noch nicht direkt ins Dokument kopieren. Dafür kann man das XML-DOM eben mit allen Rafinessen durchlaufen, die das DOM bietet.

      Jup, danke.

      1. Hallo,

        Allerdings macht [text/html] in meinem Supersonderfall :-) nicht viel Sinn...

        Nämlich weil?

        Fraglich ob der (anscheinende) Geschwindigkeitsvorteil von JSON gegenüber XML nicht dadurch verloren geht, dass ich vorher meinen Code immer escapen muss

        Serverseitig ein paar Strings bearbeiten (simple Zeichenersetzungen) ist wirklich keine Performancefrage. Clientseitig einen XML-Parser anwerfen und im DOM herumrödeln, Strings herumkonvertieren - *das* ist eine Performancefrage.

        Hab gesehen dass es dafür auch Java-Objekt gibt, nur nicht ob die das machen... Weißt du es?

        Keine Ahnung, was hat Java damit zu tun?

        Mathias

        1. Hi.

          Nämlich weil?

          ... ich es einfach muss - Altlast eines bestehenden "Webframeworks".

          Serverseitig ein paar Strings bearbeiten (simple Zeichenersetzungen) ist wirklich keine Performancefrage. Clientseitig einen XML-Parser anwerfen und im DOM herumrödeln, Strings herumkonvertieren - *das* ist eine Performancefrage.

          Das heißt egal welche exotischen Sonderzeichen zwischen den "" stehen, ich muss nur " mit " escapen und kann dann beliebigen Code dazwischen hacken, ja?

          Hab gesehen dass es dafür auch Java-Objekt gibt, nur nicht ob die das machen... Weißt du es?

          Keine Ahnung, was hat Java damit zu tun?

          War auch etwas undeutlich: Schau dir mal die "Java"-Sektion unten links auf http://www.json.org/ an, dann weißt du was ich meine.

    2. Hallo,

      { htmlcode : "<p>HTML-Code</p>" }
      Halte ich aber für unsinnig, wieso ein Format in ein weiteres packen?

      Ich hatte da mal ein ähnliches Problem und zwar gab es folgende Möglichkeiten:

      hinzufügen Reihe mit id f22: <tr id="f22"><td>foo</td><td>bar</td></tr>
      löschen Reihe mit id f22
      aktualisieren Reihe mit id f22: <tr id="f22"><td>foo</td><td><bar></td></tr>

      Ich hab das dann etwas kompliziert mit einem <add id="f22"> <del id="f22"> und <update id="f22"> Tag außenrum gemacht und innen rein dann <tr xmlns="http://www.w3.org/1999/xhtml"> um das ganze dann mit DOM rauszufriemeln und den knoten per clone() oder was das war zu kopieren um ihn dann einfügen zu können.

      Mittlerweile denke ich wäre es einfacher gewesen einfach JSON zu nutzen:

      {  
       action: "add",  
       id: "f22",  
       html: "<tr id=\"f22\"><td>foo</td><td>bar</td></tr>"  
      }
      

      Wäre das ein sinnvoller Anwendungsfall um ein Format in ein anderes zu packen?

      Hm wobei ich dann immer noch nicht weiß wie ich dann appendChild() und die anderen notwendigen Sachen anwenden können sollte.

      Grüße
      Jeena Paradies

      --
      Pavatar Zwischenstand Gravatar ist ja wieder kaputt | Jlog | Gourmetica Mentiri
      1. Hallo,

        Ich hab das dann etwas kompliziert mit einem <add id="f22"> <del id="f22"> und <update id="f22"> Tag außenrum gemacht und innen rein dann <tr xmlns="http://www.w3.org/1999/xhtml"> um das ganze dann mit DOM rauszufriemeln und den knoten per clone() oder was das war zu kopieren um ihn dann einfügen zu können.

        Mittlerweile denke ich wäre es einfacher gewesen einfach JSON zu nutzen:

        Definitiv.

        {

        action: "add",
        id: "f22",
        html: "<tr id="f22"><td>foo</td><td>bar</td></tr>"
        }

        
        >   
        > Wäre das ein sinnvoller Anwendungsfall um ein Format in ein anderes zu packen?  
          
        Sicherlich, zumal einfaches HTML hier nicht ginge, schließlich ist die Serverantwort komplex. Wobei ich dachte, dass die XML-Lösung mit eingebettetem XHTML an der Realität scheitert, da MSIE (6 zumindest) das direkte Kopieren/Importieren von Knoten aus einem mit XMLHttpRequest geladenen XHTML-Dokument nicht erlaubt.  
          
        Mathias
        
        1. Hallo,

          Wobei ich dachte, dass die XML-Lösung mit eingebettetem XHTML an der Realität scheitert, da MSIE (6 zumindest) das direkte Kopieren/Importieren von Knoten aus einem mit XMLHttpRequest geladenen XHTML-Dokument nicht erlaubt.

          Ja kann sein, meine Anwendung muss nur im Firefox 2 laufen.

          Aber wie bekomme ich es hin den String '<tr id="f22"><td>foo</td><td>bar</td></tr>' mit appendChild() an das ende einer Tabelle?

          Grüße
          Jeena Paradies

          --
          Pavatar Zwischenstand Gravatar ist ja wieder kaputt | Jlog | Gourmetica Mentiri
          1. Aber wie bekomme ich es hin den String '<tr id="f22"><td>foo</td><td>bar</td></tr>' mit appendChild() an das ende einer Tabelle?

            Mit appendChild direkt gar nicht.

            Möglichkeit 1: Man baut sich insertAdjacentHTML im Gecko nach, das geht ungefähr so:

              
            function appendHTML (element, html_string) {  
             if (element.insertAdjacentHTML) {  
              // IE und so  
              element.insertAdjacentHTML("BeforeEnd", html_string);  
             } else if (document.createRange) {  
              // Gecko  
              var range = document.createRange();  
              if (!range.selectNodeContents || !range.createContextualFragment) {  
               return false;  
              }  
              range.selectNodeContents(element);  
              var fragment = range.createContextualFragment(html_string);  
              element.appendChild(fragment);  
             } else {  
              return false;  
             }  
             return true;  
            }  
            
            

            Das habe ich glaube ich mal aus http://www.faqts.com/knowledge_base/view.phtml/aid/5756 gebastelt.

            Möglichkeit 2: Man parst den Code mit einem DOMParser-Objekt:

            var parser = new DOMParser();
            var node = parser.parseFromString(string, "text/xml");
            table.appendChild(node);

            So vom Schema her, ich habe das nicht ausprobiert.

            Wohlgeformtheit ist natürlich nötig, vielleicht eine XHTML-Namensraum-Angabe, vielleicht vorher node = document.importNode(node, true);. :)

            Mathias

            1. Mit appendChild direkt gar nicht.

              Au mann, ich steh heute echt aufm Schauch! Was ist denn der Unterschied zwischen appendChild() und element.insertAdjacentHTML("BeforeEnd", html_string). Wird nicht in beiden Fällen am Schluss ein Kindknoten (also z.B. eine tr als letztes Kind von table) angefügt?

              1. Hallo,

                Au mann, ich steh heute echt aufm Schauch! Was ist denn der Unterschied zwischen appendChild() und element.insertAdjacentHTML("BeforeEnd", html_string).

                obj.appendChild() gehört zum DOM, insertAdjacentHTML ist wohl irgendeine IE-Krücke? ;-)

                appendChild() erwartet ein DOM-objekt und insertAdjecentHTML einen String.

                Wird nicht in beiden Fällen am Schluss ein Kindknoten (also z.B. eine tr als letztes Kind von table) angefügt?

                Ja.

                Grüße
                Jeena Paradies

                --
                Pavatar Zwischenstand Gravatar ist ja wieder kaputt | Jlog | Gourmetica Mentiri
                1. obj.appendChild() gehört zum DOM, insertAdjacentHTML ist wohl irgendeine IE-Krücke? ;-)

                  Klar...

                  appendChild() erwartet ein DOM-objekt und insertAdjecentHTML einen String.

                  Hab ich Schnarcher im Eifer des Gefechts übersehen, danke.

                  Nochmal zurück zu JSON. Du hast ja anscheinend auch schon was damit gemacht... Die gleiche Frage auch an dich: sehe ich es richtig, dass es völlig egal ist, welche exotischen Sonderzeichen zwischen den "" stehen, solange ich nur enthaltene " mit " escape?

                  Grüße,
                  Bernd

                  1. Hallo,

                    Nochmal zurück zu JSON. Du hast ja anscheinend auch schon was damit gemacht... Die gleiche Frage auch an dich: sehe ich es richtig, dass es völlig egal ist, welche exotischen Sonderzeichen zwischen den "" stehen, solange ich nur enthaltene " mit " escape?

                    Ja, ist ja ein normaler String.

                    Grüße
                    Jeena Paradies

                    --
                    Pavatar Zwischenstand Gravatar ist ja wieder kaputt | Jlog | Gourmetica Mentiri
                  2. Hell-O!

                    Nochmal zurück zu JSON.

                    Nur zur Info, falls du es noch nicht kennst: http://json.org/.

                    sehe ich es richtig, dass es völlig egal ist, welche exotischen Sonderzeichen zwischen den "" stehen, solange ich nur enthaltene " mit " escape?

                    Ja.

                    Siechfred

                    --
                    Ich bin strenggenommen auch nur interessierter Laie. (molily)
                    Siechfreds Tagebuch || Falle Aufteilungsbescheid || RT 221 Erfurt-Altstadt i.V.
                    1. Ja.

                      Danke euch beiden. Wollte nur sicherstellen, dass ichs richtig verstanden hab.

                      Letzte Frage: Hat jemand von euch zufällig Erfahrung mit den auf JSON.org gelisteten Java-Tool-Klassen für JSON und kann mir da eine empfehlen. Klar muss ich da letztlich selber schauen, aber vielleicht hab ich ja Glück und ihr seid da die vollen Profis.

                      Grüße an alle.

        2. Wobei ich dachte, dass die XML-Lösung mit eingebettetem XHTML an der Realität scheitert, da MSIE (6 zumindest) das direkte Kopieren/Importieren von Knoten aus einem mit XMLHttpRequest geladenen XHTML-Dokument nicht erlaubt.

          Hää, warum soll das so sein? Quelle? Vielleicht versteh ich dich falsch, aber wenn ich meinen Server XML zurückschicken lasse, in welches sogar ganz häßliches HTML eingebettet ist (in CDATA versteht sich), dieses dann mittels JS-DOM auslese und per innerHTML einsetze, tuts sowohl im IE als auch im FF einwadfrei. Was für ein Satz... :-)

          Grüße,
          Bernd

          1. Hallo,

            wenn ich meinen Server XML zurückschicken lasse, in welches sogar ganz häßliches HTML eingebettet ist (in CDATA versteht sich), dieses dann mittels JS-DOM auslese und per innerHTML einsetze, tuts sowohl im IE als auch im FF einwadfrei.

            Ja, das ist klar.

            Was ich meinte: Wenn der Server XHTML zurückgibt bzw. XML mit direkt (nicht als CDATA!) eingebettem XHTML-Markup, dann kann man das XHTML zwar über das DOM sofort erreichen, aber nicht einfach die Knoten als Objekte herüberkopieren. Im IE geht, wie du sagtest, nur die Lösung über Strings, die dann als HTML geparst werden (z.B. bei der Einmontierung mit innerHTML).

            In fehlerfreien Browser geht halt folgendes:

            Der Server sendet:
            Content-Type: application/xml
            <p xmlns="http://www.w3.org/1999/xhtml">Hallo!</p>

            Der Browser parst das Ganze direkt mit seinem XML-Parser und erlaubt einen Zugriff über das DOM. Im JavaScript greift man dann mit request.responseXML.documentElement direkt auf das p-Elementobjekt zu. Mit document.importNode importiert man es in das bestehende (X)HTML-Dokument. Dort kann man es dann mit appendChild irgendwo einhängen.

            *Das* kann IE leider nicht.

            Mathias

            1. Hi. Wow, vielen Dank für den aufwändigen und guten Text - wusste ich alles noch nicht.

              Was ich meinte: Wenn der Server XHTML zurückgibt bzw. XML mit direkt (nicht als CDATA!) eingebettem XHTML-Markup, dann kann man das XHTML zwar über das DOM sofort erreichen, aber nicht einfach die Knoten als Objekte herüberkopieren.

              Wäre das viel schneller als die innerHTML-Variante? Beim einfügen neuer Knoten villeicht ja, oder? Beim Ersetzen musst du da ja aber vorher den bestehenden Teilbaum löschen (ist wahrscheinlich nicht aufwändig) und dann das neue reinkopieren. Hmmm, ich glaub das würd schon was bringen, gell?

              Im IE geht, wie du sagtest, nur die Lösung über Strings, die dann als HTML geparst werden (z.B. bei der Einmontierung mit innerHTML).

              Wer kanns denn momentan alles? Wie ists mit IE7? Hast du dazu irgendwelche Quellen wo ich nachlesen kann?

              1. Hallo,

                Wäre das viel schneller als die innerHTML-Variante?

                Ne ich denke innerHTML ist da doch wohl das schnellste, aber nicht so cool ;-)

                Beim einfügen neuer Knoten villeicht ja, oder? Beim Ersetzen musst du da ja aber vorher den bestehenden Teilbaum löschen (ist wahrscheinlich nicht aufwändig) und dann das neue reinkopieren. Hmmm, ich glaub das würd schon was bringen, gell?

                Ich finde so ein Vorgehen schon recht nett:

                obj.removeChild(old_child);  
                obj.appendChild(new_child);  
                obj.replaceChild(new_child, old_child);
                

                Grüße
                Jeena Paradies

                --
                Pavatar Zwischenstand Gravatar ist ja wieder kaputt | Jlog | Gourmetica Mentiri
  3. Moin!

    Klar hängt das immer vom Problemkontext ab. Eines weiß ich aber jetzt schon: ich werde teilweise nicht-XML-konformen HTML code vom Server zum Client schicken müssen.

    Dann mach das einfach: Schick das HTML-Fragment ohne irgendeine XML- oder JSON-Verpackung zum Skript zurück.

    Das Fragment steht dann als Textstring zur Verfügung und kann mit innerHTML direkt in die Webseite eingebaut werden. Performanter kriegst du XMLHttpRequest nicht hin!

    - Sven Rautenberg

    --
    "Love your nation - respect the others."