2016-09-30 9 views
0

を使用した後:ストア適切にコードのその部分でJSON.stringify

[ item { name: 'a', number: 1 }, item { name: 'b', number: 2 } ] 
[ { name: 'a', number: 1 }, { name: 'b', number: 2 } ] 

私はノードで何を得る二行目と同じである:

function item(name, number){ 
    this.name = name; 
    this.number = number; 
} 

var item1 = new item('a',1); 
var item2 = new item('b',2); 
var box1 = [item1,item2]; 

console.log(box1); 
var box2 = JSON.stringify((box1), null, 2); 
console.log(JSON.parse(box2)); 

私は出力があることを取得box1fs.writeFile(filePath, data,...);というファイルに保存しようとしたときに発生します。
jsonファイルに最初のファイルを作成する方法はありますか?

+0

あなたは 'item'を保つことを意味しますか?私はJSONがクラスを覚えている方法はないと思っています。それはデータだけを格納します。 – DrakaSAN

+0

はい、私はJSONのことを知っています。私は何か別の方法を望んでいました。 – user3732793

+0

私はこの問題がファイルへの書き込み方法にあるかもしれないと思っていますが、そのコードをあなたの質問に含めなかったのですか? – anneb

答えて

2

短い答えは:自動的にです。 JSONはオブジェクトのprototypeを自動的に保存しません。

あなたはです。ですが、少しコードを入れて自分で処理する必要があります。あなたの最初の出力[ item {} ]でコード

/W


長い答え、itemは、オブジェクトプロトタイプが何であるかを伝えるのノードの方法です。

残念ながら、オブジェクトのJSON.stringifyを呼び出すと、そのビットの情報が失われ、すべてのitemがプレーンオブジェクトになります。だから、それらを元に戻して解析すると、ノードはitemが元々のようにnew item()で作成されているとは知らないのです。

タイプは「ヒント」というプロトタイプがすると仮定されているもので、各オブジェクトに新しいプロパティを追加し、バックで解析する際に、明示的にそれを扱うことになる「保存」の一つの簡単な方法:

function item(name, number){ 
    this.name = name; 
    this.number = number; 

    // prototype hint  
    this._prototype = "item"; 
} 

var item1 = new item('a',1); 
var item2 = new item('b',2); 
var box1 = [item1,item2]; 

console.log(box1); 
var box2 = JSON.stringify((box1), null, 2); 

// now map over the items 
var parsed = JSON.parse(box2); 
var mapped = parsed.map(function(object) { 
    if (object._prototype === "item") { 
    return new item(object.name, object.number); 
    } 
    return object; 
}); 
console.log(mapped); 

さらに強力なものが必要な場合は、とfromJSONのメソッドをクラスに追加し、JSONから< - >にマッピングするときにそれらのメソッドを呼び出すことで、この考え方を拡張できます。

+0

のように探していたものでした。コード例をありがとう! – user3732793

0

独自のシリアライザを書くのは簡単ではありません。幸いなことに、シンプルなJSONシリアライズは難しいことではありませんが、非標準JSONフォーマットを使用するために書かなければならないパーサーはイライラします。

しかし、これはあなたが実際に欲しくない場合だと思われます。 JSONは、言語にとらわれないデータのシリアル化形式です。言語に自然な形で表現できるデータを格納します。 Javascriptでは、これは通常オブジェクトリテラルです。 Javaや.NETでは、クラス(POJO/POCO)になります。他の言語では、マップや辞書。オブジェクトのプロトタイプの名前をオブジェクトに含めると、変更する可能性の高い特定の実装にデータがバインドされます。突然、アイテム関数の名前を変更することさえできません。それはあなたが必要としない制限です。

関連する問題