import { JsonClassType, JsonProperty, ObjectMapper, JsonGetter, JsonSetter } from 'jackson-js';

class User {
  @JsonProperty() @JsonClassType({type: () => [Number]})
  id: number;
  @JsonProperty() @JsonClassType({type: () => [String]})
  firstname: string;
  @JsonProperty() @JsonClassType({type: () => [String]})
  lastname: string;
  @JsonProperty() @JsonClassType({type: () => [Array, [String]]})
  fullname: string[];

  constructor(id: number, firstname: string, lastname: string) {
    this.id = id;
    this.firstname = firstname;
    this.lastname = lastname;
  }

  @JsonGetter() @JsonClassType({type: () => [String]})
  getFullname(): string {
    return this.firstname + ' ' + this.lastname;
  }

  @JsonSetter()
  setFullname(fullname: string) {
    this.fullname = fullname.split(' ');
  }
}

const user = new User(1, 'John', 'Alfa');
const objectMapper = new ObjectMapper();

const jsonData = objectMapper.stringify<User>(user);
console.log(jsonData);
// {"id":1,"firstname":"John","lastname":"Alfa","fullname":"John Alfa"}
const userParsed = objectMapper.parse<User>(jsonData, {mainCreator: () => [User]});
console.log(userParsed);
/*
User {
  id: 1,
  firstname: 'John',
  lastname: 'Alfa',
  fullname: [ 'John', 'Alfa' ]
}
*/