642 Stimmen

Wie konvertiere ich ein JSON-Objekt in eine TypeScript-Klasse?

Ich lese ein JSON-Objekt von einem entfernten REST-Server. Dieses JSON-Objekt hat alle Eigenschaften einer TypeScript-Klasse (nach Design). Wie kann ich dieses empfangene JSON-Objekt in eine Typvariable umwandeln?

Ich möchte keine TypeScript-Variable auffüllen (d. h. einen Konstruktor haben, der dieses JSON-Objekt übernimmt). Es ist groß und das Kopieren jedes einzelnen Unterobjekts und jeder Eigenschaft würde viel Zeit in Anspruch nehmen.

Update: Sie können es jedoch in eine TypeScript-Schnittstelle umwandeln!

0voto

QC-cheetah Punkte 276

Sie können dieses npm-Paket verwenden. https://www.npmjs.com/package/class-converter

Es ist einfach zu verwenden, zum Beispiel:

Klasse UserModel {
  @property('i')
  id: number;

  @property('n')
  name: string;
}

const userRaw = {
  i: 1234,
  n: 'name',
};

// verwenden Sie toClass, um ein einfaches Objekt in eine Klasse umzuwandeln
const userModel = toClass(userRaw, UserModel);
// Sie erhalten eine Klasse, ähnlich wie die unten stehende
// const userModel = {
//   id: 1234,
//   name: 'name',
// }

0voto

Doronm Punkte 86

Ich stieß auf ein ähnliches Bedürfnis. Ich wollte etwas, das mir eine einfache Transformation von/zu JSON ermöglicht, das von einem REST-API-Aufruf zu/von einer spezifischen Klassendefinition kommt. Die Lösungen, die ich gefunden habe, waren unzureichend oder bedeuteten, meinen Klassencode umzuschreiben und Annotationen oder Ähnliches hinzuzufügen.

Ich wollte etwas Ähnliches wie GSON in Java verwenden, um Klassen zu JSON-Objekten zu serialisieren/deserialisieren.

In Kombination mit einem späteren Bedarf, dass der Konverter auch in JS funktionieren sollte, habe ich beschlossen, mein eigenes Paket zu erstellen.

Es hat jedoch ein wenig Overhead. Aber wenn es erst einmal gestartet ist, ist es sehr praktisch beim Hinzufügen und Bearbeiten.

Sie initialisieren das Modul mit:

  1. Konvertschema - ermöglicht das Zuordnen von Feldern und Bestimmen, wie die Konvertierung durchgeführt wird
  2. Klassenmap-Array
  3. Konvertierungsfunktionskarte - für spezielle Konvertierungen

Dann verwenden Sie in Ihrem Code das initialisierte Modul wie folgt:

const convertedNewClassesArray: MyClass[] = this.converter.convert(jsonObjArray, 'MyClass');

const convertedNewClass: MyClass = this.converter.convertOneObject(jsonObj, 'MyClass');

oder, zu JSON:

const jsonObject = this.converter.convertToJson(myClassInstance);

Verwenden Sie diesen Link zum npm-Paket und auch eine detaillierte Erklärung, wie Sie mit dem Modul arbeiten können: json-class-converter

Ich habe es auch für die Verwendung in Angular eingewickelt: angular-json-class-converter

0voto

Jaroslav Punkte 1973

In den neuesten TS können Sie Folgendes tun:

const isMyInterface = (val: any): val is MyInterface => {
  if (!val) { return false; }
  if (!val.myProp) { return false; }
  return true;
};

Und dann den Benutzer so verwenden:

if (isMyInterface(data)) {
 // jetzt wird data vom Typ MyInterface sein
}

0voto

Mac Chibueze Punkte 59

Ich habe diese Bibliothek hier verwendet: https://github.com/pleerock/class-transformer

    import { plainToClass } from 'class-transformer';

Implementierung:

private async getClassTypeValue() {
  const value = await plainToClass(ProductNewsItem, JSON.parse(response.data));
}

Manchmal müssen Sie die JSON-Werte analysieren, damit plainToClass erkennt, dass es sich um formatierte JSON-Daten handelt

0voto

Mattia S. Punkte 483

Mit einem einzigen tapi.js können Sie das! Es ist ein leichter Automapper, der in beide Richtungen funktioniert.

npm i -D tapi.js

Dann können Sie einfach tun

let typedObject = new IhreKlasse().fromJSON(jsonDaten)

oder mit Versprechungen

axios.get(...).als(IhreKlasse).dann(typedObject => { ... })

Sie können mehr darüber lesen auf den Dokumenten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X