首页 > 解决方案 > 允许将日期反序列化为 JsonServiceClient 中的 js Date 对象

问题描述

肯定与其他问题有关(例如d.ts 中对 servicestack typescript 客户端的日期支持),但我想我问的更多=)

首先,我确实认为 json 没有传递真正的 JS Date 作为 ServiceStack 将 C# DTO DateTime 代码生成为 TypeScript 中的字符串的原因...

然而在其他 fetch 客户端包装器中,类似于 SS JsonServiceClient,我在使用JSON.parse(json, reviver)的第二个 arg来查找日期模式并反序列化为正确的 JS 日期时有很好的经验......

切入正题,作为概念证明,我已经修改了“JsonServiceClient.prototype.createResponse = function (res, request)”,就像这样......

...
    if (isJson) {
        // return res.json().then(function (o) {
        //     return o;
        // });
        return res.text().then(function (o) {
            return JSON.parse(o, 
                (_key, value) => (typeof value === 'string' && value.startsWith('/Date')) ? new Date(parseFloat(value.slice(6,-2))) : value
            );
        });
    }
...

仅供参考,很高兴已经有了 TypeScriptGenerator 挂钩来影响我想要的代码生成,例如

TypeScriptGenerator.PropertyTypeFilter = (gen, type, prop) =>
    (prop.Type == "DateTime" ? "Date" : gen.GetPropertyType(prop, out var isNullable));

对于背景,为健壮的 React DataGrid 提供适当的日期变得非常优雅(我碰巧使用 Telerik/Progress “KendoRect” 套件)......当真正的日期存在时,网格的本机行为可以过滤和排序这些日期与不适合字符串。

神话,

您是否可以考虑在 JsonServiceClient 中提供一个“挂钩”,以便我们可以提供这样的自定义反序列化功能?或可能的替代方案?

谢谢你所做的一切!

仅供参考,我正在使用最新的 v5.9.3 堆栈

标签: servicestack

解决方案


我在这个提交parseJson中添加了一个钩子,您可以在其中自定义 JSON 的解析方式:JsonServiceClientJsonServiceClient

const client = new JsonServiceClient(baseUrl);
client.parseJson = res => res.text().then(s => JSON.parse(s,reviver));

从现在 npm 上的 v1.0.34+ 可以使用此更改。


推荐阅读