Joachim: object in json-string umwandeln

Hi,

klar, gibts schon. Aber selber bauen macht mehr Spass, deshalb habe ich mir eine kleine Funktion dafür erstellt. Damit möchte ich lediglich "überschaubare" Objekte, die strukturell dem Beispiel ähneln, wandeln.

Ich würde mich über Optimierungstipps freuen, insbesonder zum Handling des abschliessenden Kommas einer Liste, die ja im IE zu Fehlern führen und daher nicht erscheinen dürfen. Ich habe das einmal mit Subparts und join bzw einem Flag, ein anderes Mal mit einem Replace vie regEx der jeweils der letzten Kommas gelöst.

Test mit Subparts, join und flag
Test mit regEx und replace

Natürlich bin ich ebenso über andere Hinweise, vor allem auch zu möglichen Fehlerquellen dankbar. Bedenkt aber, das Ding soll keine Wunderwaffe werden, wenn es mit Date nicht umgehen kann ist das für mich ok...

Gruesse, Joachim

--
Am Ende wird alles gut.
  1. Lieber Joachim,

    Test mit Subparts, join und flag
    Test mit regEx und replace

    für eine gültige JSON-Syntx musst Du meines Wissens auch den Eigenschaften-Namen in doppelte Anführungszeichen setzen. In JavaScript braucht man das nicht, in JSON aber wohl.

    var JSONObj = {  
        "eigenschaft" : "wert",  
        "methode" : function (param) {  
            // Code  
        }  
    }
    

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. Hallo,

      • Du berücksichtigst keine Funktionen
      • In Strings werden ' und " beide in " umgewandelt

      Sonst kannst du an der Algoritmik durchaus etwas arbeiten, meine Funktion sieht z.B. so aus:

        
      Object.toJSON = function(o) {  
          switch((typeof(o)).toLowerCase()) {  
              case 'object':  
                  var s = '{';  
                  var p = [];  
                  for(i in o) {  
                      var e = Object.toJSON(i)+': '+Object.toJSON(o[i])+'';  
                      p.push(e);  
                  }  
                  s += p.join(', ');  
                  s += '}';  
                  return s;  
              case 'string':  
                  return "'"+o.escapeSingleQuoted().replaceJSSpecialChars()+"'";  
              case 'number':  
                  return o+'';  
              case 'boolean':  
                  return o+'';  
              case 'function':  
                  return (o+'').escapeSingleQuoted().killJSSpecialChars();  
          }  
          return false;  
      }  
      
      

      mfg, Flo

      --
      sh:) fo:| ch:? rl:( br:^ n4:| ie:{ mo:| va:} de:> zu:} fl:{ ss:) ls:< js:|
      1. Hi,

        • Du berücksichtigst keine Funktionen

        ja, das war für meine Zwecke nicht so wichtig...

        Sonst kannst du an der Algoritmik durchaus etwas arbeiten

        da hst Du wohl recht ;-)

        var e = Object.toJSON(i)+': '+Object.toJSON(o[i])+'';

        das ist sehr schön und löst das Komma-Thema komplett...

        replaceJSSpecialChars()

        welche Zeichen ersetzt/entfernst Du? Ich nehme an Zeilenumbrüche u. ä...

        Erst mal vielen Dank, auch an Felix. Das hilft mir weiter...

        Gruesse, Joachim

        --
        Am Ende wird alles gut.
        1. Hallo,

          |                 var e = Object.toJSON(i)+': '+Object.toJSON(o[i])+'';
          das ist sehr schön und löst das Komma-Thema komplett...

          Ja :)

          | replaceJSSpecialChars()
          welche Zeichen ersetzt/entfernst Du? Ich nehme an Zeilenumbrüche u. ä...

          genau

          Erst mal vielen Dank, auch an Felix. Das hilft mir weiter...

          kein problem

          mfg, Flo

          --
          sh:) fo:| ch:? rl:( br:^ n4:| ie:{ mo:| va:} de:> zu:} fl:{ ss:) ls:< js:|
      2. liebe Kinder,

        habt Ihr Euch, bevor Ihr jeder fuer sich ueber das ziel hinausgeschossen seid,
        auch nur einmal die muehe gemacht, die nicht sonderlich umfangreiche und
        auch keineswegs misszudeutende JSON-spezifikation ueberhaupt zu lesen?

        bessere bildungsvorschriften wie die auf »json.org« aufgefuehrten schemata gibt
        es nicht und braucht es auch nicht.

        alles was in vermeintlichen JSON-notationen an mehr neben [Object]- und
        [Array]- objekten, [string]-, [number]-, und boolean-werten sowie [null]
        enthalten ist, laesst diese notationen genau das sein, was sie sind:
        native JavaScript-objekt_LITERAL_-notationen.

        @Flo(levu):
        Deine von Dir gepostete bildungsvorschrift wirft einen [TypeError], sobald ich
        versuche, eins der von Joachim beispielhaft verlinkten objekte an [Object.toJSON]
        zu verfuettern.
        liefe Dein algorithmus fehlerfrei, genuegten dessen ergebnisse aber weder den
        anforderungen an JSON-strings noch kaemen sie in die naehe der ergebnisse
        eines in gecko-browsern nativ implementierte »obj.toSource()« - alles andere
        waere nicht akzeptabel oder beduerfte einer eigenen spezifikation.

        so long - peterS. - pseliger@gmx.net

        --
        »Because objects in JavaScript are so flexible, you will want to think differently about class hierarchies.
        Deep hierarchies are inappropriate. Shallow hierarchies are efficient and expressive.« - Douglas Crockford
        ie:( fl:) br:> va:( ls:& fo:) rl:) n3;} n4:} ss:} de:µ js:} mo:? zu:]
        1. Hallo,

          habt Ihr Euch, bevor Ihr jeder fuer sich ueber das ziel hinausgeschossen seid,
          auch nur einmal die muehe gemacht, die nicht sonderlich umfangreiche und
          auch keineswegs misszudeutende JSON-spezifikation ueberhaupt zu lesen?

          Hab ich, und ich habe entschieden, das so einfach wie möglich zu machen, weil es bis jetzt noch keine Probleme gab

          || alles was in vermeintlichen JSON-notationen an mehr neben [Object]- und

          [Array]- objekten, [string]-, [number]-, und boolean-werten sowie [null]
          enthalten ist, laesst diese notationen genau das sein, was sie sind:
          native JavaScript-objekt_LITERAL_-notationen.

          ja, und, wir etwa nicht?

          @Flo(levu):
          Deine von Dir gepostete bildungsvorschrift wirft einen [TypeError], sobald ich
          versuche, eins der von Joachim beispielhaft verlinkten objekte an [Object.toJSON]
          zu verfuettern.

          Oh, muss ich mal gucken, woran das liegt :(

          liefe Dein algorithmus fehlerfrei, genuegten dessen ergebnisse aber weder den anforderungen an JSON-strings noch kaemen sie in die naehe der ergebnisse  eines in gecko-browsern nativ implementierte »obj.toSource()« - alles andere waere nicht akzeptabel oder beduerfte einer eigenen spezifikation.

          hmm, ich sehe ein, dass es sehr kurz und unvollständig ist. Dafür funktioniert es aber eben nicht nur in gecko :)

          Ich werde mir mal ein Beispiel angucken und überprüfen, wie es dort gemacht wurde...

          mfg, Flo

          --
          sh:) fo:| ch:? rl:( br:^ n4:| ie:{ mo:| va:} de:> zu:} fl:{ ss:) ls:< js:|
        2. Hallo,

          Deine von Dir gepostete bildungsvorschrift wirft einen [TypeError], sobald ich versuche, eins der von Joachim beispielhaft verlinkten objekte an [Object.toJSON] zu verfuettern.

          Nein, raus kommt:

          "{'foo': 'bar', 'lala': {'zak': {'0': 'dd', '1': 'aa', '2': {'xxl': 'start,"ccc"'}}, 'zuk': {'0': 'fgh', '1': true}, 'zik': {'batz': {'0': 'x', '1': {'ab': 'u'}}, 'bum': {'0': 'xxxx', '1': 'uuuu'}}}, 'post': {'papst': {'chefe': {'fux': {'0': 1, '1': 2, '2': 3}}}, 'papa': {'kind': true}}, '0': {'0': 1, '1': 2, '2': 3}}"

          mfg, Flo

          --
          sh:) fo:| ch:? rl:( br:^ n4:| ie:{ mo:| va:} de:> zu:} fl:{ ss:) ls:< js:|
          1. Hallo,

            Bearbeiten muss es geben!!!

            Natürlich so: (Firebug maskiert " nicht automatisch)

            "{'foo': 'bar', 'lala': {'zak': {'0': 'dd', '1': 'aa', '2': {'xxl': 'start,\"ccc\"'}}, 'zuk': {'0': 'fgh', '1': true}, 'zik': {'batz': {'0': 'x', '1': {'ab': 'u'}}, 'bum': {'0': 'xxxx', '1': 'uuuu'}}}, 'post': {'papst': {'chefe': {'fux': {'0': 1, '1': 2, '2': 3}}}, 'papa': {'kind': true}}, '0': {'0': 1, '1': 2, '2': 3}}"

            mfg, Flo

            --
            sh:) fo:| ch:? rl:( br:^ n4:| ie:{ mo:| va:} de:> zu:} fl:{ ss:) ls:< js:|
        3. Hi,

          Deine von Dir gepostete bildungsvorschrift wirft einen [TypeError], sobald ich versuche, eins der von Joachim beispielhaft verlinkten objekte an [Object.toJSON] zu verfuettern.

          hm, das kann ich nicht bestätigen. Bei mir läuft die Sache korrekt - mit besagtem Testobjekt, siehe
          http://www.wendenburg.de/test/create_json/create_json_from_obj5.html

          Gruesse, Joachim

          --
          Am Ende wird alles gut.