1

我们使用 js-joda LocalDate 来表示模型中的各种日期,并将这些日期存储在 sessionStorage 中。是否有一种通用的首选方法来存储这些日期,以便它们可以序列化/反序列化,而无需向包含它们的每个对象添加特殊代码?

我们一直在使用标准JSON.stringify/JSON.parse来执行此操作,但是由于LocalDate在字符串化时转换为 ISO 字符串,因此当我们将其LocalDate解析回来时会丢失其类型。

如此处所示

这是摘要:

const myObj = { a: "thing", d: LocalDate.parse('2019-01-20') };
const stringified = JSON.stringify(myObj);
const parsed = JSON.parse(stringified);

// this fails because d is no longer a LocalDate
console.log(parsed.d.year());

我们现在的解决方法是为任何包含 LocalDate 的类提供自定义反序列化器,但这似乎有点笨拙。

为此寻求更清洁的解决方案。%o也许我们可以为 LocalDate 制作一个通用的序列化器,它输出与console.log 中的修饰符相同的东西?

mydate -> serialize -> "LocalDate { _year: 2019, _month: 1, _day: 20}"

在我们这样做之前,我想看看这是否已经干净地完成了,或者我是否只是遗漏了一些明显的东西。

4

1 回答 1

2

回答我自己的问题。

我很惊讶它没有出现,但解决方案就在 and 的定义JSON.stringifyJSON.parse

当我需要用地图做同样的事情时,这篇文章为我指出了解决方案。

JSON.parse(text[, reviver])
JSON.stringify(value[, replacer[, space]])

我需要添加替换器和恢复器来进行自定义序列化:

function myReviver(key: string, value: any) {
    if (value === undefined) return undefined;
    if (value === null) return null;
    if (typeof value === 'object') {
        switch (value.dataType) {
            case 'LocalDate':
                return LocalDate.parse(value.value);
            case 'LocalTime':
                return LocalTime.parse(value.value);
            case 'LocalDateTime':
                return LocalDateTime.parse(value.value);
            case 'Period':
                return Period.parse(value.value);
        }
    }
    return value;
}

function myReplacer(key, value) {
    const originalObject = this[key];
    if (originalObject instanceof LocalDate) {
        return {
            dataType: 'LocalDate',
            value: originalObject.toJSON()
        };
    } else if (originalObject instanceof LocalTime) {
        return {
            dataType: 'LocalTime',
            value: originalObject.toJSON()
        };
    } else if (originalObject instanceof LocalDateTime) {
        return {
            dataType: 'LocalDateTime',
            value: originalObject.toJSON()
        };
    } else if (originalObject instanceof Period) {
        return {
            dataType: 'Period',
            value: originalObject.toJSON()
        };
    } else {
        return value;
    }
}

每当我调用 stringify 或 parse 时,我都会添加上述函数作为它们的替换器/恢复器。

JSON.stringify(mystuff, myReplacer);
JSON.parse(mystuff, myReviver);
于 2019-12-28T18:19:31.787 回答