【问题标题】:Custom JSON converter for Noda Time野田时间的自定义 JSON 转换器
【发布时间】:2016-09-06 20:19:17
【问题描述】:

我正在为 .NET Core 开发,所以我使用的是不稳定的最新 alpha 版本的 Noda Time (2.0.0-alpha20160729)。正在使用 JSON 处理数据。

我将接受用户对出生日期字段的输入,并且我希望支持多种输入格式,以防用户无法按照指示感到困惑。例如,我想同时接受MM-dd-yyyyM/d/yy 等。

serialization docs 特别声明如下:

可以使用NodaPatternConverter 从模式轻松创建自定义转换器。

我终其一生都无法弄清楚如何做到这一点。据我了解,我需要实现NodaPatternConverter<LocalDate> 本身,IPattern<LocalDate> 用于解析,Action<T> 用于验证。

我开始编写IPattern.Parse<LocalDate>,但该函数返回ParseResult<LocalDate>,显然无法访问。它不能以我发现的任何方式实例化或使用。因此我被困住了。

如何为 Noda Time 正确创建自定义 JSON 转换器?

【问题讨论】:

    标签: c# json .net-core nodatime


    【解决方案1】:

    首先,这听起来不像是在 JSON 转换器中做的正确的事情。如果您直接在 JSON 中接受用户输入,则应将其视为字符串,并稍后解析,IMO。 JSON 是机器对机器的格式,而不是人对机器的格式。假设这是一个 Web 应用程序,您可能希望使用 moment.js 在客户端解析数据并将其重新格式化为 ISO-8601。或者,将其反序列化为字符串并然后在您的服务器端代码中进行转换。

    无论如何,对于 JSON 转换器,您只需要实现 IPattern<LocalDate> - 您不需要 实现 NodaPatternConverter<LocalDate>,因为它已经存在。你只需要:

    var pattern = ...;
    var converter = new NodaPatternConverter<LocalDate>(pattern);
    

    现在,要实现您的模式,您可能希望从现有模式中实际创建它 - 编写一个实现,该实现一个接一个地委托给一个 IPattern&lt;LocalDate&gt;,直到结果是成功的 ParseResult&lt;T&gt; - 或返回最终不成功ParseResult&lt;T&gt;。请注意,ParseResult&lt;T&gt; 并非不可访问 - 但您不能(当前)创建自己的实例。这可能是我应该解决的问题,但在这种情况下,你真的不需要。

    您需要的代码已经存在但未公开 - 您需要 CompositePatternParse 部分。要实现 Format 部分,您可以使用第一个模式来格式化值...如果您甚至需要。

    【讨论】:

    • 啊,好的,我会测试一下并报告。我认为转换器将是处理验证成功的最佳位置,而不是在我的模型上同时使用字符串和LocalDate 并从前者填充后者。 (这也与 Json.net 相关,试图使用一个用于序列化,另一个用于反序列化。但我离题了。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    • 1970-01-01
    • 2014-10-22
    • 2014-09-20
    • 2012-09-16
    • 1970-01-01
    相关资源
    最近更新 更多