JSでJSON化した時に型情報も保存してほしい時

投稿者:
babu
babu

JSでPHPのserialize、unserializeみたいにインスタンスの情報覚えといてほしいなーって時ありますよね

そんなときはtypeson

https://github.com/dfahlander/typeson

https://www.npmjs.com/package/typeson

こんな感じ

const Typeson = require('typeson');

// こんなクラスを保存したい
class Ningen {
  constructor(name, hp, birthday) {
    this.name = name
    this.hp = hp
    this.birthday = birthday
  }

  hpLog() {
    console.log(`${this.name}のHPは${this.hp}です 誕生日は${this.birthday.toLocaleDateString()}です`)
  }
}
// 型情報を登録しておく
const typeson = new Typeson().register({
  Ningen,
  // ビルトインクラスはプリセットが用意されてあるはずなのでわざわざ以下のように書く必要はないと思う
  Date: [
    (x) => x instanceof Date, // テスト用
    (d) => d.getTime(), // 保存するときの値変換用
    (n) => new Date(n), // 復元するときの変換用
  ],
});

// 人間リストw
const a = [
  new Ningen("a", 25,   new Date("1920 12-01")),
  new Ningen("b", 78,   new Date("1975 03-01")),
  new Ningen("c", 5000, new Date("1992 05-01")),
];

const tson = typeson.stringify(a);
// このように型情報が含まれたjsonになっている
// {"$":[{"name":"a","hp":25,"birthday":-1549011600000},{"name":"b","hp":78,"birthday":162831600000},{"name":"c","hp":5000,"birthday":704646000000}],"$types":{"$":{"0":"Ningen","1":"Ningen","2":"Ningen","0.birthday":"Date","1.birthday":"Date","2.birthday":"Date"}}}

// ふっかつのじゅもん!
const revived = typeson.parse(tson);
//[
//  Ningen { name: 'a', hp: 25, birthday: 1920-11-30T15:00:00.000Z },
//  Ningen { name: 'b', hp: 78, birthday: 1975-02-28T15:00:00.000Z },
//  Ningen { name: 'c', hp: 5000, birthday: 1992-04-30T15:00:00.000Z }
//]

revived.forEach(ningen => {
  ningen.hpLog();
});
// output
// aのHPは25です 誕生日は1920/12/1です
// bのHPは78です 誕生日は1975/3/1です
// cのHPは5000です 誕生日は1992/5/1で

おわり

babu
babu

他にいいライブラリあったら教えてね〜〜