javascript - Serialiser og deserialiser JSON med Angular 2
Jeg vil bruke Angular 2 til å lage en nettleserapp hvor du kan lage og dele prøveeksamener. Jeg har en Exam-klasseinstans som inneholder ExamSection-klasseinstanser som igjen inneholder ExamQuestion-klasseinstanser osv.
Jeg ønsker at appen skal kunne lagre og laste prøvene som JSON. Min nåværende løsning er:
constructor(private http:Http) {
this.http.get('Exam.json')
.map((response) => {
return response.json();
}).subscribe(data => {
this.exam = <Exam>data;
//console.log(typeof(<Exam>data));
console.log(this.exam);
this.refreshMarksMethods(this.exam);
});
}
Det første problemet er at JSON blir deserialisert som et vanlig objekt. Jeg forsøkte å bruke serializer.ts (https://www.npmjs.com/package/serializer.ts) og class-transformer (https://github.com/pleerock/class-transformer) for å utføre serialisering og deserialisering for TypeScript-klassene som Angular jobber med, men jeg får stadig feil som gjelder manglende moduler. Modulene som mangler er ikke referert til i eksemplene for disse bibliotekene, så vidt jeg kan forstå, så jeg vet ikke hvor de hører hjemme.
Et triks jeg prøvde for å omgå problemet var å kaste de vanlige objektene til den nødvendige Typescript-typen, men dette fungerer ikke (objekttypen endres ikke). Fordi objektene er vanlige objekter, mister jeg metodene og også egenskaper som length (for arrays).
Kan noen være så snill å forklare meg hvordan jeg kan konvertere TypeScript-objekter til og fra JSON i en Angular-app, inkludert hvordan og hvor de nødvendige bibliotekene skal plasseres? Noen ganger fungerer det å legge modulen i «node_modules»-mappen, og noen ganger hører den hjemme et sted i «src»-mappen (jeg må vanligvis finne dette ut gjennom prøving og feiling).
Rediger: Jeg fikk en kronglete løsning til å fungere der objektene beskrevet i JSON har en "deserialize"-metode som brukes til å rekursivt rekonstruere klasseinstansene. Jeg håper noen kan forklare hvordan man bruker en annen løsning fordi jeg tviler på at min nåværende løsning vil fungere for store prosjekter.
Svar #1
Jeg laget en liten pakke kalt json-dry. Den støtter (sirkulære) referanser og også klasseinstanser.
Du må definere 2 klassemetoder (toDry på prototypen og unDry som en statisk metode), registrere klassen, og så er du i gang.
Jeg har brukt det i mange år, og det kan også serialisere veldig store samlinger.