2017-02-08 2 views
0

Ich habe eine Klasse mit mehreren Schnittstellen darin, um JSON-Daten zu modellieren. Zum Beispiel:Angular2 & Typescript - Erstellen eines Objekts aus verschachtelten JSONs

interface A { 
    id: number; 
} 

interface B { 
    name: string; 
    surname?: string; 
} 

class MyClass implements A { 
    people: B[]; 
    notes: string[]; 

    function1(){...} 
    function2(){...} 
} 

Und ich habe eine JSON in der gleichen Struktur:

{ 
    id: 1, 
    people: [ 
    { 
     name: "john" 
    }, 
    { 
     name: "alice", 
     surname: "smith" 
    } 
    ], 
    notes: [ "Very important top secret note" ] 
} 

Kann ich eine Instanz von MyClass aus diesem JSON direkt erstellen?

Antwort

1

Ihre Datenstruktur fast das gleiche wie die Klasse ist, dann würden Sie eine ID-Eigenschaft der Klasse

class MyClass implements A { 
    id: number; 
    // .... 
} 

Das Problem hinzufügen müssen, ist, wenn Sie so etwas wie dies versuchen, zu tun:

let data: MyClass = { 
    id: 1, 
    people: [ 
    { 
     name: "john" 
    }, 
    { 
     name: "alice", 
     surname: "smith" 
    } 
    ], 
    notes: [ "Very important top secret note" ] 
} 

Dies funktioniert nicht, da Ihr Json nicht über die Methoden (function1, function2) verfügt.

Eine Lösung wäre wirklich die MyClass zu instanziiert und die json passieren, oder eine Konstruktor-Methode dafür haben wie

class MyClass { 
    static createFrom(jsonData: A & B): MyClass { 
     // create the objct and return 
    } 
} 

Oder Sie durch die Kombination eine bestehende Instanz der eine Variable dieses Typs schaffen könnte Klasse und Verbreitung der JSON.

Wie so:

let json = { 
    id: 1, 
    people: [ 
     { 
      name: "john" 
     }, 
     { 
      name: "alice", 
      surname: "smith" 
     } 
    ], 
    notes: ["Very important top secret note"] 
} 
const c = new MyClass(); 

let mClass: MyClass = {...json, function1: c.function1, function2: c.function2 }; 

mClass.function1(); 

Link to playground

+0

Zunächst einmal hat eine Schnittstelle, um die 'id' Feld und' MyClass' es implementiert, sollte ich es wieder erklären? Zweitens habe ich viel mehr Interfaces/Klassen als dieses Beispiel, also wird es zu viel Zeit in Anspruch nehmen, alle mit einem Konstruktor zu initiieren, der json braucht. Zuletzt habe ich versucht, eine Instanz einer Klasse zu erstellen, die keine Methoden als 'a: AClass = {...}' hat, aber wenn ich das getan habe, hat 'eine Instanz von AClass' false zurückgegeben. Ist die zweite Methode, die Sie vorgeschlagen haben, eine echte Instanz dieser Klasse zu erstellen oder wird sie nur als "json" beibehalten? –

Verwandte Themen