2012-02-20 8 views
1

[[]]にシリアライズ対象:JSON.stringifyは

0:

[[]] 

私はそれは次のようにシリアル化するために期待します

[[Col1 : 'val1', Col2: 'val2']] 

内部オブジェクトのプロパティがシリアル化されないのはなぜですか?あなたがオブジェクトのように、あなたの内側の配列を使用するので、オブジェクトの代わりに、配列作る

Code snippet at JSFiddle.

+0

訪問http://json.org。 JSONには2つの構造があることがわかります。 1つはキーと値のペアを許可し、もう1つは単純な順序付きリストです。 JavaScriptオブジェクトはキーと値のペアにシリアル化され、JavaScript配列は順序付きリストにシリアル化されます。 –

答えて

4

としてそれを使用します。これを次のように変更します。

var row = {}; 

これはオブジェクトリテラルを作成します。あなたのコードは、(単一のオブジェクトを含む)オブジェクトの配列になります:

[{"Col1":"val1","Col2":"val2"}] 

更新本当に何が起こるかを確認するには、あなたがjson2.js on GitHub

を見ることができます。アレイのみ配列要素を列挙正常forループで反復処理さ

if (Object.prototype.toString.apply(value) === '[object Array]') { 
    //... 
    length = value.length; 
    for (i = 0; i < length; i += 1) { 
     partial[i] = str(i, value) || 'null'; 
    } 
    //... 
} 
//... 
for (k in value) { 
    if (Object.prototype.hasOwnProperty.call(value, k)) { 
     //... 
    } 
    //... 
} 
//... 

注意:これは、(高濃度低下)(JSON.stringifyによって呼び出される)str関数からの抜粋です。オブジェクトはfor...inループで反復され、hasOwnPropertyテストでproeprtyが実際にこのオブジェクトに属していることを確認します。

+0

配列は1,2,3のキーだけをシリアル化し、val1のようなランダムな名前ではありませんか? – Andomar

+0

配列の内容がシリアル化されます。配列オブジェクトのプロパティに値を代入しようとすると、実際には配列に追加されません。 –

+0

このプロパティは、デバッガで表示されるという意味で追加されています。 – Andomar

3

var lst = []; 
var row = {}; 
row.Col1 = 'val1'; 
row.Col2 = 'val2'; 
lst.push(row); 

又はrowが配列ではなくオブジェクトであるためアレイ

var lst = []; 
var row = {}; 
row.push('val1'); 
row.push('val2'); 
lst.push(row); 
+0

ありがとう、upvoted!それはジェームズからの答えで、 '{}'がオブジェクトで、 '[]'が配列であることがわかりました – Andomar

1

行を辞書ではなくベクトルにします。このように定義:配列はJSONでデータ型がある

var row = {}; 
+0

+1スタックオーバーフローへようこそ:) – Andomar

1

ので、Arrayの実際のインスタンスが他のオブジェクトタイプとは異なる文字列化されています。

JavaScriptのArrayインスタンスが非数値キーで文字列化されている場合、[ ... ] JSON配列構文では表現できませんでした。

たとえば、[ "Col1": "val1"]は、JSON配列に明示的なキーを設定できないため無効です。
{"Col1": "val1"}は有効ですが、配列ではありません。

そして、あなたは確かに 'n'matchとマッチして{ "Col1": "val1", 1, 2, 3 ]か何かを得ることはできません。ところで

が、これは正常に動作します:

var lst = []; 
var row = {}; 
row.Col1 = 'val1'; 
row.Col2 = 'val2'; 
lst.push(row); 
alert(JSON.stringify(lst));​