Noda Time的自定义JSON转换器

时间:2016-09-06 20:19:17

标签: c# json .net-core nodatime

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

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

serialization docs具体说明如下:

  

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

我不能为我的生活弄清楚如何做到这一点。据我所知,我需要实现NodaPatternConverter<LocalDate>本身,IPattern<LocalDate>进行解析,Action<T>进行验证。

我开始编写IPattern.Parse<LocalDate>,但该函数返回显然无法访问的ParseResult<LocalDate>。它无法以我找到的任何方式进行实例化或使用。我被卡住了。

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

1 个答案:

答案 0 :(得分:8)

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

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

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

现在,要实现您的模式,您可能希望实际使用现有模式创建它 - 编写一个实现,该实现将一个IPattern<LocalDate>委托给另一个ParseResult<T>,直到结果为ParseResult<T>成功 - 或者返回最终失败的ParseResult<T>。请注意,Parse不可访问 - 但您不能(当前)创建自己的实例。这是我应该解决的问题,但在这种情况下你并不需要。

您需要的代码已经存在但未公开 - 您需要CompositePatternFormat部分。要实现class MatchAddress { public string Name { get; set; } public string Taluka { get; set; } public string District { get; set; } public string Pincode { get; set; } public float Rank { get; set; } } 部分,您可以使用第一个模式格式化值...如果您需要。