Joachim: json2: Umwandlung object in json-string

Hi,

Bin verwirrt.

Ich habe ein kleines Object, aus dem ich ein json machen möchte:
    var opt =  {
        "foo": [1, 2, 3],
        "bar": function() {alert(1)},
        "batz": {
            1: "lala",
            2: "zack"
        }
    }

Wenn ich dies mit json2 mache, erhalte ich diese Ausgabe:

{"foo":[1,2,3],"batz":{"1":"lala","2":"zack"}}

Soweit so schön, aber wo steckt "bar"? Werden Funktionen ignoriert? War es naiv zu glauben, dass eine Funktion ja _auch_ ein Objekt ist, und daher mit den json.org Spez. übereinstimmen müsste?

Mit FF toSource() erhalte ich dagegen:

({foo:[1, 2, 3], bar:(function () {alert(1);}), batz:{1:"lala", 2:"zack"}})

Wer kann mich aufklären?

Merci & Gruesse, Joachim

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

    Ich habe ein kleines Object, aus dem ich ein json machen möchte:
        var opt =  {
            "foo": [1, 2, 3],
            "bar": function() {alert(1)},
            "batz": {
                1: "lala",
                2: "zack"
            }
        }

    Wenn ich dies mit json2 mache, erhalte ich diese Ausgabe:

    {"foo":[1,2,3],"batz":{"1":"lala","2":"zack"}}

    Soweit so schön, aber wo steckt "bar"? Werden Funktionen ignoriert? War es naiv zu glauben, dass eine Funktion ja _auch_ ein Objekt ist, und daher mit den json.org Spez. übereinstimmen müsste?

    Mit FF toSource() erhalte ich dagegen:

    ({foo:[1, 2, 3], bar:(function () {alert(1);}), batz:{1:"lala", 2:"zack"}})

    Wer kann mich aufklären?

    Du musst unterscheiden zwischen JSON, einer Notation, wie sie auf json.org beschrieben ist, und JavaScript, welches u.a eine JSON-ähnliche Syntax kennt, um Objekte zu definieren.

    Die toSource() Methode zeigt die JavaScript, die Ausgabe von json2 oben ist gültiges JSON (und JavaScript). json.org zeigt mir im Übrigen nicht, dass eine Funktion als Wert zulässig ist. Genauer: als "value" sind nur Strings, Numbers, Object, Array, true, false, null erlaubt. Dabei (und hier liegt dein Denkfehler) ist ein Object kein JavaScript-Object, sondern ein Object, wie es in der Spezifikation etwas weiter oben steht.
    Eine name/value-Paarung, mit Kommata getrennt und eingeschlossen von geschweiften Klammern.

    Bis die Tage,
    Matti

    1. Hi

      Dabei (und hier liegt dein Denkfehler) ist ein Object kein JavaScript-Object, sondern ein Object, wie es in der Spezifikation etwas weiter oben steht.

      hm, ich neige dazu, Dir zuzustimmen... eigentlich vereinfacht es ja die Sache ;-)

      Gruesse, Joachim

      --
      Am Ende wird alles gut.
  2. Werden Funktionen ignoriert?

    JSON ist ein Subset von JavaScript, das nur Literale der Typen Object, Array, String, Boolean, Number und null erlaubt. Keine RegExp, Function, Date, NaN, Infinity oder undefined. Keine anderen Expressions und Operatoren. Also auch keine Function-Expressions.

    Wenn du Objekte mit Funktionen serialisieren willst, ist JSON nicht das richtige Format für dich.

    War es naiv zu glauben, dass eine Funktion ja _auch_ ein Objekt ist

    Ist es. Würde es als bloßes Objekt verarbeitet, so würde der JSON-Serialisier er aber doch bloß nach enumerable properties suchen und diese rekursiv serialisieren. Da hat eine Funktion wenig (nichts?) zu bieten.

    toSource ist etwas ganz anderes und ruft im Falle von Funktionen toString() auf. Das kannst du natürlich selbst machen, um ein Objekt zu serialisieren.

    Mathias