typescript - Konvertera json till klassinstans med class-transformer


Jag skulle vilja skapa en instans av Customer-klassen från ett Json-objekt.

Men genom att använda plainToInstance-funktionen från class-transformer har jag inte den korrekta klassinstansen som ett typ-säkert TypeScript-objekt.

Vad gör jag fel?

Import

import { plainToInstance } from 'class-transformer';

Kund JSON

    const json = `{
      "id": "1",
      "name": "Jogn",
      "surname": "Doe",
      "email": "[email ",
      "phone": "123456789"
  }
}
`;

Kundklassdefinition

import { Field, ObjectType, Directive, ID } from '@nestjs/graphql';
import { Address } from './address';

@ObjectType()
@Directive('@key(fields: "id")')
export class Customer {

  @Field(() => ID)
  id: string;

  @Field()
  name: String;

  @Field({nullable: true})
  surname?: String;

  @Field()
  email: String;

  @Field({nullable: true})
  phone?: String;

  @Field()
  customerType: String;

  @Field()
  customerStatus: String;

  @Field(() => [Address], { nullable: true })
  addresses?: [Address]
}

Transformation från Json till Customer-instans

let customer : Customer = plainToInstance(Customer, json) as Customer;
console.log('customer.email);

Konsolresultat

Customer email: undefined

Så jag kunde inte få kundens e-post här

Detta är vad jag har när jag loggar hela kundvariabeln

console.log(customer);

{
      "id": "1",       
      "name": "Jogn",  
      "surname": "Doe",
      "email": "[email ",
      "phone": "123456789"
}

Test med att skapa Customer-instansen direkt

var x = new Customer();
x.id = "123";
console.log(x)

Så, nu ser objektet korrekt ut i konsolen

Customer { id: '123' }

Svar #1

Du måste skicka ett JSON-objekt till plainToInstance - inte en sträng.
det vill säga din json-variabel bör vara

const json = {
  id: '1',
  name: 'Jogn',
  surname: 'Doe',
  email: '[email ',
  phone: '123456789',
};

här är ett fungerande Stackblitz-exempel

Svar #2

Den andra egenskapen av plainToInstance bör vara ett vanligt objekt, så du måste tolka din JSON-sträng till ett objekt:

let customer = plainToInstance(Customer, JSON.parse(json))