【问题标题】:Preferred way to serialize/deserialize js-joda LocalDate?序列化/反序列化 js-joda LocalDate 的首选方式?
【发布时间】:2020-02-19 19:47:07
【问题描述】:

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

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

如图所示here

总结如下:

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 的类提供自定义反序列化器,但这似乎有点笨拙。

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

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

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

【问题讨论】:

  • 遇到了同样的问题。最后在 JSON 中添加了一个字段 $type,该字段存储了一个表示类型的标签。

标签: json serialization ecmascript-6 js-joda


【解决方案1】:

回答我自己的问题。

我很惊讶它没有出现,但解决方案就在 JSON.stringify 和 JSON.parse 的定义中。

This post 在我需要对地图执行相同操作时向我指出了解决方案。

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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 2018-09-29
    • 2015-09-01
    • 2021-06-09
    • 2014-01-06
    • 2013-09-25
    • 1970-01-01
    相关资源
    最近更新 更多