我上课了:
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.
答案 0 :(得分:-2)
this question的现有解决方案仍然正确。
您是否希望使用符合JSON.stringify()
值的JSON.parse()
和Map
进行某种替代?你需要自己写。
这两个函数都有一个可选参数(replacer
为JSON.stringify()
,reviver
为JSON.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()
的替代品,或者写它自己。