gpt4 book ai didi

javascript - 如何指示 JSON.stringify() 自定义序列化日期类型?

转载 作者:行者123 更新时间:2023-12-04 13:37:56 24 4
gpt4 key购买 nike

class MyClass {
myString: string;
myDate: Date;
}

function foo() {
const myClassArray: MyClass[] = ....
return JSON.stringify(myClassArray); // or expressApp.status(200).json(myClassArray);
}
foo将返回 json带有 myDate 的字符串遵循 ISO 标准 YYYY-MM-DDThh:mm:ssZ 的字符串.

我希望能够自定义 JSON.stringify()正在序列化 myDate .

我不拘泥于 JSON.stringify() 来实现我想要的,尽管我更喜欢它,因为 express.json() 在幕后使用它。如果这是不可能的,是否有一个序列化库可以帮助我实现我想要的?也许是一个实现装饰器模式的库?或者可能是更原生的解决方案?

最佳答案

您可以使用 replacer参数并传入一个函数。可能有一种更清洁的方法可以做到这一点,但这是一个简单的例子:

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)


编辑

我的 TypeScript 装饰器功夫不是最强的,所以如果有人有任何建议,请随时指出改进。

作为装饰者:
@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));

关于javascript - 如何指示 JSON.stringify() 自定义序列化日期类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60780152/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com