我正在为.NET Core开发,所以我使用了Noda Time(2.0.0-alpha20160729)的不稳定的最新alpha版本。正在使用JSON处理数据。
我将接受出生日期字段的用户输入,并且我想支持多种输入格式,以防用户无法按照指示感到困惑。例如,我想同时接受MM-dd-yyyy
和M/d/yy
。
serialization docs具体说明如下:
可以使用NodaPatternConverter从模式轻松创建自定义转换器。
我不能为我的生活弄清楚如何做到这一点。据我所知,我需要实现NodaPatternConverter<LocalDate>
本身,IPattern<LocalDate>
进行解析,Action<T>
进行验证。
我开始编写IPattern.Parse<LocalDate>
,但该函数返回显然无法访问的ParseResult<LocalDate>
。它无法以我找到的任何方式进行实例化或使用。我被卡住了。
如何为Noda Time正确创建自定义JSON转换器?
答案 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
不可访问 - 但您不能(当前)创建自己的实例。这是我应该解决的问题,但在这种情况下你并不需要。
您需要的代码已经存在但未公开 - 您需要CompositePattern
的Format
部分。要实现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; }
}
部分,您可以使用第一个模式格式化值...如果您需要。