web-dev-qa-db-ja.com

TypeScript Map <string、string>をjson文字列表現に変換します

TypeScriptに_Map<string, string>_変数があります。

_let m = Map<string, string>().set('tag', 'v1');
_

Json文字列表現に変換したい:

_'{"tag": "v1"}'
_

私は3つの方法を試しました。最初はm.toString()を使用することです。 2つ目は、JSON.stringify(m)を使用することです。どちらも_{}_を返しました。私はMapを最初にjavascript objectに変換してから文字列に変換することも試みました:

_function MapToString(map): string {
  let ro = {};
  Object.keys(map).forEach( key => {
    ro[key] = map[key];
  });
  return JSON.stringify(ro);
}

s = MapToString(m);
_

これは、コンソールで印刷しようとしたときに_{}_も返しました。

7
breezymri

私は最終的にes6 Mapの使用をあきらめ、tags.toJSON()が機能する TSMap に切り替えました。

6
breezymri

読める?いいえ、でも機能します

JSON.stringify(
  Array.from(
    new Map().set('tag', 'v1').set('foo', 'bar').entries()
  )
  .reduce((o, [key, value]) => { 
    o[key] = value; 

    return o; 
  }, {})
)

@ james-hayが指摘したように、おそらくオブジェクトを空にするタイプミスがあります

9
Lostfields

それはあなたの質問に直接答えるものではありませんが、私が同じ問題を抱えていたとき、私はマップの使用を再考し、プレーンなJavaScriptオブジェクトを選びました。 JSONは常に文字列をキーとして必要とするため、マップの主な利点の1つ(任意のタイプのキー)はいずれにしても失われます。

Mapのもう1つの利点は、Map<String, Array<String>>のような、Nice型のシグネチャを許可することです。しかし、ここではTypeScriptの「インデックスシグネチャ」がプレーンJavaScriptオブジェクトにこれを正確に提供し、キーの名前を許可しています。

interface CityLists {
    [postcode: string]: Array<string>
};

これはマップのように使用でき(もちろん構文は異なります)、直接JSON ネストされている場合でもに変換されます。オブジェクトツリーをJSONに変換する場合、後者は非常に重要だと思います。JSONを使用すると、マップを他の任意のオブジェクトや配列のどこかにネストできます。

別の方法として、TypeScriptの型もRecord<K, T>です。このユースケースでは、型付きマップとして使用されるプレーンオブジェクトです。上記の例では、次のように書くことができます。

let cityLists: Record<string, Array<string>>;
cityLists["capitals"] = ["Rome", "Paris", "Berlin"];
4