2016-05-01 8 views
0

私はJSON.stringifyが文字列化しないことを知っていますが、水分補給が本当に疲れているので、何が良い方法です。私は新しいオブジェクトを作成したくありません。何か案が ?typescript JSON.stringify緩い型と関数

class pers { 
    name = ""; 
    last = ""; 

    constructor(name: string, last: string) { 
     this.name = name; 
     this.last = last; 
    } 

    alo() { 
     alert(this.name); 
    } 
} 

let pa = new pers("ben", "troq"); 
let s = JSON.stringify(pa); 
let o = <pers>JSON.parse(s); 
let pb = new pers("", ""); 

pb = o; 
pb.alo(); 
+0

http://stackoverflow.com/questions/8111446/turning-json-strings-into-objects-with-methods –

+3

無関係ですが、自分自身を好意的にしてコードを一貫させる( '='それがあなたをより幸せにするならばどこにでも)、名前(クラス 'person'、例えば、名前、名前、最後の代わりに' firstname'と 'lastname'属性)を書き出します。 'pa''''''''''''''''''' 'pb''などは何を意味するのでしょうか? – Sumurai8

答えて

3

問題は、この行です:

let o = <pers>JSON.parse(s); 

私はあなたがこのタイプのキャストだと思うが、それはないである信じ。これは、type-assertionであり、ランタイムサポートを意味するものではありません。

o instanceof pers; // false 

あなたが手動NitzanとしてあなたのJSONを使用してオブジェクトのインスタンスを作成する必要があります。基本的に、あなただけのoはタイプpersのですが、それはランタイムで事実ではないと信じてにコンパイラを言っていますsuggests、または対応するプロパティーで正しいインスタンスを自動的に作成するためのメタデータ情報を読み取るルーチンを作成します。後者のアプローチのための


、私はこの正確な問題にエレガントで広く適応ソリューションを提供するために作成され、TypedJSONを試してお勧めします:、パラメータなしのコンストラクタを注意

@JsonObject 
class pers { 
    @JsonMember name = ""; 
    @JsonMember last = ""; 

    constructor(name?: string, last?: string) { 
     this.name = name; 
     this.last = last; 
    } 

    alo() { 
     alert(this.name); 
    } 
} 
let o = TypedJSON.parse(s, pers); 
o instanceof pers; // true 
o.alo(); // "ben" 

をそれは必須です(同様のシステムでも同様です)。

このソリューションはReflectDecoratorsをベースにしていますが、必須ではありません(ただし、プロパティがない場合は、たとえば、@JsonMember({ type: String }) ...などのプロパティのコンストラクタ関数を手動で指定する必要はありません)。

+0

偉大な答え、非常に有益。ありがとう。 – NPE

1

機能性からデータを分離するのはどうですか?

interface PersData { 
    name: string; 
    last: string; 
} 

class pers { 
    private data: PersData; 

    constructor(data: PersData | string) { 
     this.data = typeof data === "string" ? JSON.parse(data) : data; 
    } 

    alo() { 
     alert(this.data.name); 
    } 
} 
0

は交換してください:

let o = <pers>JSON.parse(s); 
let pb = new pers("", ""); 

pb = o; 
pb.alo(); 

と:それは動作するはずです

let o = JSON.parse(s); 
let pb = Object.create(pers.prototype); 
Object.assign(pb, o); 

pb.alo(); 

Object.create(ES5.1)は、persクラスからのものであるが、persコンストラクタを実行していないプロトタイプのオブジェクトを作成します。 Object.assign(ES6)は、JSONからシリアル化されていないオブジェクトのプロパティをpbが参照するオブジェクトにコピーします。プロトタイプがObject.createによって正しく設定されたため、メソッドを呼び出すことができます。

+0

ここにコードを入力するのではなく、答えを説明できますか?あなたの答えが働く重要なことは何ですか?他の人があなたの答えから学び、他の質問にそれを適用できるので、私は尋ねます。これは、stackoverflowについてです---盲目的にいくつかのコードをコピー&ペーストすることではありません。 – Robert

+0

申し訳ありませんが、スニペットが自明であると思いました。説明を編集して追加しました。 –