2016-06-29 5 views
2

私はプロジェクトにtypescriptを使用しています。コレクションをjsonにシリアル化してファイルに保存し、後でそのファイルを同様のコレクションにデシリアライズする必要があります。コレクションのようなものになります。jsonを複数のタイプのコレクションにデシリアライズする

elements: Array<tool> 

を、私のツールのインターフェースは次のようになります。

export interface tool { 
    name: string; 
    draw(context:any); 
} 

とツールの実装は次のようになります。

export class textTool implements tool { 
    name: string; 
    fontSize:number; 
    fontType:string; 
    draw(context:any){ 
     // draws the control... 
    } 
} 

私はツールインタフェースのいくつかの実装を持っています: textTool、imageTool、およびrectangleToolです。私が解決しなければならない問題は、ファイルのコンテンツをツールのコレクションにデシリアライズすると、通常のオブジェクトだけで、textToolのインスタンスではありません。

私はJSON.stringify(elements)を使用してjsonを作成し、JSON.parse(jsonText)をデシリアライズします。

私はパーソンが、どの種類のインスタンスを作成するべきかを知る方法がないことを理解しています.Jsonテキストには情報がありません。私は、必要なクラスインスタンスを特定するためのフィールドや何かを追加し、そのクラスを手動で「新規」にすることを考えました。どのようなオプションを私は手動でツールのコレクションにjsonを解析する必要はありません(適切なタイプ)?

+0

選択肢がたくさんがあります:あなたは、「別のファイルに、または1つのファイルにが異なると、異なるタイプを保存することができますそれぞれのタイプごとに「セクション」があります。また、以下のように各オブジェクトをラップすることもできます: '{" type ":" textTool "、" object ":{...}}' –

+0

@NitzanTomerおそらく動作することに同意します。他の何か、または私は何かが欠けていた。 – LPains

+0

「良い」は客観的な基準ではありません。あなたが「より良い」という意味でより具体的になることによって、より客観的になる方法があるかもしれませんが、この質問は事実ではなく意見を呼び寄せます。 –

答えて

5

はあなたが、フィールドtypeを追加し、かなりまっすぐ進むとなり、実装クラスの型の文字列の間のマッピングと、変換コードを作成することができます言ったように:

export interface tool { 
    type: string; 
    name: string; 
    draw(context:any): void; 
} 

class textTool implements tool { 
    type:string = 'textTool'; 
    name:string; 
    fontSize:number; 
    fontType:string; 

    draw(context:any):void { 
    } 
} 

const typeMapping:any = { 
    'textTool' : textTool 
    //all other types 
}; 
let json = '[{"type":"textTool", "name": "someName", "fontSize": 11}]'; 
let elements: Array<tool> = JSON.parse(json).map((i:any) => { 
    let target:any = new typeMapping[i.type]; 
    for (const key in i) { 
     target[key] = i[key]; 
    } 
    return target; 
}); 

*コードを複製することは、非常に単純ですが、それは普通のオブジェクトのために十分です。プレーンなオブジェクトのための

+0

ありがとうございます。私の環境でこれを試してみましょう。 – LPains

1

それを試してみてください。

function deserialize<T>(json): T[] { 
    let collection: T[] = []; 
    json.map((item: T) => { 
     collection.push(item); 
    }); 
    return collection; 
} 

とそれを呼び出す:

let tools: tool[] = deserialize<textTool>(json); 
関連する問題