Javascript 如何指示JSON.stringify()自定义序列化日期类型?
Javascript 如何指示JSON.stringify()自定义序列化日期类型?,javascript,typescript,Javascript,Typescript,foo将使用myDate按照ISO标准YYYY-MM-DDThh:MM:ssZ重新运行json字符串 我希望能够自定义JSON.stringify()如何序列化myDate 我并不坚持使用JSON.stringify()来实现我想要的,尽管我更喜欢它,因为express.JSON()在幕后使用它。如果这是不可能的,是否有一个序列化库可以帮助我实现我想要的?也许是一个实现装饰器模式的库?或者可能是一个更原生的解决方案?您可以使用replacer参数并传入一个函数。可能有一种更干净的方法可以做到这一
foo
将使用myDate
按照ISO标准YYYY-MM-DDThh:MM:ssZ
重新运行json
字符串
我希望能够自定义JSON.stringify()
如何序列化myDate
我并不坚持使用JSON.stringify()来实现我想要的,尽管我更喜欢它,因为express.JSON()在幕后使用它。如果这是不可能的,是否有一个序列化库可以帮助我实现我想要的?也许是一个实现装饰器模式的库?或者可能是一个更原生的解决方案?您可以使用
replacer
参数并传入一个函数。可能有一种更干净的方法可以做到这一点,但这是一个简单的例子:
class MyClass {
myString: string;
myDate: Date;
}
function foo() {
const myClassArray: MyClass[] = ....
return JSON.stringify(myClassArray); // or expressApp.status(200).json(myClassArray);
}
编辑
我的字体装饰功夫不是最强的,所以如果有人有任何建议,请随时指出改进
作为一名装饰师:
const data = [{
date: new Date(),
id: 1
},
{
date: new Date(),
id: 2
}
]
const a = JSON.stringify(data)
const b = JSON.stringify(data, replacer('date'))
function replacer(target) {
return function(key, value) {
if (key == target) {
const month = new Date(value).getMonth()
return `Date month: ${month}`
}
return value
}
}
// [{"date":"2020-03-20T19:13:11.594Z","id":1},{"date":"2020-03-20T19:13:11.594Z","id":2}]
console.log(a)
// [{"date":"Date month: 2","id":1},{"date":"Date month: 2","id":2}]
console.log(b)
JSON.stringify
不解析任何东西…?进入JSON.stringify()的对象以字符串结束。那不是解析吗?不,那是序列化。您可以使用第二个参数来包含基于值类型的自定义逻辑。我试过了,但是replacer函数非常有限(或者我没有找到答案)。例如,如果我传递一个数组,那么当我传递对象本身时,数组是不同的。这可能是您忽略的东西。我想我的代码中有一个bug,因为这应该可以工作。有没有我可以遵循的装饰模式?直接注释类?这样我就不必对我所有的类都这样做了?@Kam我添加了一个decorator示例
@transformDate
class MyClass {
date: Date;
id: number;
constructor(date, id) {
this.date = date;
this.id = id;
}
}
function transformDate(target: any) {
const formatted = new Intl.DateTimeFormat("en", {
year: "numeric",
month: "short",
day: "2-digit"
}).format(this.date);
target.prototype.toJSON = function() {
return {
...this,
date: formatted
};
};
return target;
}
const data = [new MyClass(new Date(), 1), new MyClass(new Date(), 2)];
// [{"date":"Mar 20, 2020","id":1},{"date":"Mar 20, 2020","id":2}]
console.log(JSON.stringify(data));