Object to Json中的Typescript Map

时间:2017-10-23 15:08:03

标签: javascript json typescript

我上课了:

export class Widget {
  public id: any;
  public name: string;
  public position: number;
  public height: number;
  public width: number;
  public type: string;
  public params: Map<string, string>;
...
}

我想要对该类的对象进行字符串化,但我总是得到空的参数... 我尝试过:

JSON.stringify(widget) - 空参数映射{}

我也尝试将params从课堂上分开:

JSON.stringify([...widget.params])但我得到了:

TS2461: Type 'Map<string, string>' is not an array type.

1 个答案:

答案 0 :(得分:-2)

this question的现有解决方案仍然正确。

您是否希望使用符合JSON.stringify()值的JSON.parse()Map进行某种替代?你需要自己写。

这两个函数都有一个可选参数(replacerJSON.stringify()reviverJSON.parse()),允许您自定义JavaScript对象与JSON之间的转换方式。这是一种可能性:

const JSONWithMap = (mapIdentifier: string = "SerializedES6Map!!") => ({

  stringify(
    value: any,
    replacer?: ((key: string, value: any) => any) | (number | string)[] | null,
    space?: string | number
  ): string {

    let innerReplacer: (key: string, value: any) => any;
    if ((typeof replacer === 'undefined') || (replacer === null)) {
      innerReplacer = (k, v) => v;
    } else if (Array.isArray(replacer)) {
      innerReplacer = (k, v) => replacer.indexOf(k) >= 0 ? v : void 0;
    } else {
      innerReplacer = replacer;
    }

    let outerReplacer = function(this: any, key: string, value: any) {
      if (value instanceof Map) {        
        value = { [mapIdentifier]: Array.from(value.entries()) };
      }
      return innerReplacer.call(this, key, value);
    }

    return JSON.stringify(value, outerReplacer, space);

  },

  parse(text: string, reviver?: (key: any, value: any) => any): any {
    let innerReviver: (key: string, value: any) => any;
    if (typeof reviver === 'undefined' || reviver === null) {
      innerReviver = (k, v) => v;
    } else {
      innerReviver = reviver;
    }
    let outerReviver = function(this: any, key: string, value: any) {
      if ((typeof value !== 'undefined') && (Array.isArray(value[mapIdentifier]))) {
        return new Map(value[mapIdentifier]);
      }
      return innerReviver.call(this, key, value);
    }
    return JSON.parse(text, outerReviver);
  }
});

函数JSONWithMap()接受一个可选的字符串参数,用于在序列化和反序列化Map时进行标记,默认为"SerializedES6Map!!",希望您不会在其他对象中使用。它的stringify()方法就像JSON.stringify()一样,除了它还将Map转换为具有单个键的对象,其值为序列化条目数组,其parse()方法行为就像JSON.parse()一样,除了它识别那些序列化的Map对象并将它们反序列化为Map s。

你可以像这样使用它:

declare const widget: Widget; // some widget instance
const JSONM = JSONWithMap(); // use default identifier
const widgetJSON = JSONM.stringify(widget); // serialize
const deserializedWidget = JSONM.parse(widgetJSON); // deserialize into plain JS object
const rehydratedWidget = Object.assign(new Widget(), deserializedWidget); // actually make instance of class from plain JS object

注意我说“你需要自己编写”,然后交给你一个实现。那么实现还没有经过测试,除非非常简短,所以你需要彻底测试它,为你的Widget类做一些自定义的东西,它不是JSON.stringify()的替代品,或者写它自己。

祝你好运。