web-dev-qa-db-ja.com

JSON.stringifyをTypeScriptゲッター/セッターと組み合わせて使用​​する

TypeScriptでゲッター/セッターアクセサーを使用しています。変数とメソッドに同じ名前を付けることはできないため、多くの例で行われているように、変数の前に下のダッシュを付け始めました。

private _major: number;

get major(): number {
  return this._major;
}
set major(major: number) {
  this._major = major;
}

ここで、JSON.stringify()メソッドを使用してオブジェクトをJSON文字列に変換すると、変数名がキーとして使用されます:_major。

JSONファイルの前にすべてのキーの前にダッシュを付けたくないので、TypeScriptでgetterメソッドの名前を使用できるようにする可能性はありますか?または、getter/setterメソッドを使用してもクリーンなJSON出力を生成する他の方法はありますか?

文字列出力に書き込まれる前に、JSONキーを手動で変更する方法があることを私は知っています。しかし、もっと簡単な解決策があるかどうか興味があります。

これがJSFiddleです これは現在の動作を示しています。

12
Dominic

いいえ、プロパティ名の代わりにゲッター/セッター名を使用してJSON.stringifyを使用することはできません。

しかし、あなたはこのようなことをすることができます:

class Version {
    private _major: number;

    get major(): number {
        return this._major;
    }

    set major(major: number) {
        this._major = major;
    }

    toJsonString(): string {
        let json = JSON.stringify(this);
        Object.keys(this).filter(key => key[0] === "_").forEach(key => {
            json = json.replace(key, key.substring(1));
        });

        return json;
    }
}

let version = new Version();
version.major = 2;
console.log(version.toJsonString()); // {"major":2}
4
Nitzan Tomer

@ Jan-Aagaardソリューションに基づいて私はこれをテストしました

public toJSON(): string {
    let obj = Object.assign(this);
    let keys = Object.keys(this.constructor.prototype);
    obj.toJSON = undefined;
    return JSON.stringify(obj, keys);
}

toJSONメソッドを使用するため

9
alacambra

プロパティを繰り返して文字列を操作するのは危険だと思います。オブジェクト自体のプロトタイプを使用して、次のようにします。

public static toJSONString() : string {
    return JSON.stringify(this, Object.keys(this.constructor.prototype)); // this is version class
}
3
JoSeTe4ever

私は小さなライブラリ ts-typed を作成しました。これは、実行時の入力を目的としたゲッター/セッターを生成します。 JSON.stringify()を使用するときに同じ問題に直面しました。だから私は一種のシリアライザーを追加し、それをtoJSONと呼ぶ一種のtoString(Javaで)購入を実装することを提案することによってそれを解決しました。

次に例を示します。

import { TypedSerializer } from 'ts-typed';

export class RuntimeTypedClass {
    private _major: number;

    get major(): number {
       return this._major;
    }

    set major(major: number) {
       this._major = major;
    }
    /**
    * toString equivalent, allows you to remove the _ prefix from props.
    *
    */
    toJSON(): RuntimeTypedClass {
        return TypedSerializer.serialize(this);
    }
}
0
Yacine