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

Fred Punkte 11

Ich denke, dass json2typescript eine gute Alternative ist https://www.npmjs.com/package/json2typescript

Sie können JSON in ein Klassenmodell mit einer einfachen Modellklasse und Annotationen konvertieren

In Projekt verwendet

0voto

DarthGelum Punkte 1

Sie können so etwas machen:

// Map-Methode
function mapJSONtoObj(json: any, arg: Type): Type {
  Object.keys(json).forEach((elem:string)=>{
    let iterable:any = arg;
    let markerType = 0

    // Wir müssen um den Umstand herum arbeiten, dass null und Array beide Objekte sind
    markerType |= typeof(json[elem]) == 'object'?1:0
    markerType |= Array.isArray(json[elem])?2:0
    markerType |= json[elem]==null?4:0

    switch(markerType)
    {
      case 1:
      mapJSONtoObj(json[elem], iterable[elem])
      break;
      default:
      iterable[elem] = json[elem];
    }
  })
  return arg;
}

// Verwendungsbeispiel

class Internal {
  internVar: number = 0
}
class InternalArr {
  internArrVar: number = 0
}
class Root {
  rNum: number = 0
  internArrOfObj: InternalArr[] = []
  internObj: Internal = new Internal()
} 

let json = {
  rNum:1,
  internArrOfObj: [{
    internArrVar: 2
  }],
  internObj: {
    internVar:3
  }
}

let at = new Root()
let to = mapJSONtoObj(json, at);

Und natürlich können Sie die Mapping-Klassen in Schnittstellen umschreiben und sie wie folgt verwenden:

let at = new Object as Root // wenn Root eine Schnittstelle ist

// Und schließlich müssen wir in "case 1" die Bedingung berücksichtigen, dass das Objekt undefiniert ist

// Ihre mapJSONtoObj Funktion
...
 switch(markerType)
    {
      case 1:
      iterable[elem] = {} // <---- fügen Sie diesen hinzu
      mapJSONtoObj(json[elem], iterable[elem])
      break;
      default:
      iterable[elem] = json[elem];
    }
...

-1voto

ashkufaraz Punkte 5004

Sie können JSON zu einer Eigenschaft wie folgt casten

class Jobs {
  constructor(JSONdata) {
    this.HEAT = JSONdata.HEAT;    
    this.HEAT_EAF = JSONdata.HEAT_EAF;    
  }

}

 var job = new Jobs({HEAT:'123',HEAT_EAF:'456'});

-2voto

SamazoOo Punkte 335

Dies ist eine einfache und wirklich gute Option

let person = "{"name":"Sam","Age":"30"}";

const jsonParse: ((key: string, value: any) => any) | undefined = undefined;
let objectConverted = JSON.parse(textValue, jsonParse);

Und dann haben Sie

objectConverted.name

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