C# Noda Time的自定义JSON转换器
我是为.NETCore开发的,所以我使用的是野田佳彦最新的alpha版本(2.0.0-alpha20160729)。正在使用JSON处理数据 我将接受一个出生日期字段的用户输入,我希望支持多种输入格式,以防用户无法按照指示进行操作。例如,我想接受C# Noda Time的自定义JSON转换器,c#,json,.net-core,nodatime,C#,Json,.net Core,Nodatime,我是为.NETCore开发的,所以我使用的是野田佳彦最新的alpha版本(2.0.0-alpha20160729)。正在使用JSON处理数据 我将接受一个出生日期字段的用户输入,我希望支持多种输入格式,以防用户无法按照指示进行操作。例如,我想接受MM dd yyyy和M/d/yy,等等 委员会具体声明如下: 可以使用从模式轻松创建自定义转换器 但我一辈子都不知道该怎么做。据我所知,我需要实现NodaPatternConverter本身、IPattern进行解析,以及Action进行验证 我开始编
MM dd yyyy
和M/d/yy
,等等
委员会具体声明如下:
可以使用从模式轻松创建自定义转换器
但我一辈子都不知道该怎么做。据我所知,我需要实现NodaPatternConverter
本身、IPattern
进行解析,以及Action
进行验证
我开始编写IPattern.Parse
,但该函数返回的显然是无法访问的。它不能被实例化或以我发现的任何方式使用。所以我被卡住了
如何正确地为Noda Time创建自定义JSON转换器?首先,在JSON转换器中这样做听起来并不正确。如果您直接在JSON中接受用户输入,则应将其视为字符串,稍后再进行解析,IMO.JSON是机器对机器的格式,而不是人对机器的格式。假设这是一个web应用程序,您可能希望使用moment.js在客户端解析数据,并将其重新格式化为ISO-8601。或者,将其反序列化为字符串,然后在服务器端代码中进行转换 无论如何,对于JSON转换器,您只需要实现
IPattern
——不需要实现NodaPatternConverter
,因为它已经存在。你只需要:
var pattern = ...;
var converter = new NodaPatternConverter<LocalDate>(pattern);
var模式=。。。;
var转换器=新的节点转换器(模式);
现在,要实现您的模式,您可能需要实际使用现有模式创建它—编写一个实现,将一个IPattern
委托给另一个ParseResult
,直到结果是成功的ParseResult
,或者返回最终不成功的ParseResult
。请注意,ParseResult
不是不可访问的,但您(当前)无法创建自己的实例。这可能是我应该解决的问题,但在这种情况下,你真的不需要
您需要的代码已经存在,但尚未公开-您需要的是
Parse
部分。要实现格式
部分,您可以使用第一个模式来格式化值。。。如果需要的话。首先,在JSON转换器中这样做听起来并不正确。如果您直接在JSON中接受用户输入,则应将其视为字符串,稍后再进行解析,IMO.JSON是机器对机器的格式,而不是人对机器的格式。假设这是一个web应用程序,您可能希望使用moment.js在客户端解析数据,并将其重新格式化为ISO-8601。或者,将其反序列化为字符串,然后在服务器端代码中进行转换
无论如何,对于JSON转换器,您只需要实现IPattern
——不需要实现NodaPatternConverter
,因为它已经存在。你只需要:
var pattern = ...;
var converter = new NodaPatternConverter<LocalDate>(pattern);
var模式=。。。;
var转换器=新的节点转换器(模式);
现在,要实现您的模式,您可能需要实际使用现有模式创建它—编写一个实现,将一个IPattern
委托给另一个ParseResult
,直到结果是成功的ParseResult
,或者返回最终不成功的ParseResult
。请注意,ParseResult
不是不可访问的,但您(当前)无法创建自己的实例。这可能是我应该解决的问题,但在这种情况下,你真的不需要
您需要的代码已经存在,但尚未公开-您需要的是
Parse
部分。要实现格式
部分,您可以使用第一个模式来格式化值。。。如果需要的话。啊,好的,我会测试一下,然后再报告。我认为如果成功的话,转换器将是处理验证和转换的最佳场所,而不是在我的模型上同时使用字符串和LocalDate
,然后用前者填充后者。(这对于Json.net来说也很糟糕,试图用一个进行序列化,另一个进行反序列化。但我离题了。)啊,好吧,我会测试一下,然后再报告。我认为如果成功的话,转换器将是处理验证和转换的最佳场所,而不是在我的模型上同时使用字符串和LocalDate
,然后用前者填充后者。(这对于Json.net来说也是一团糟,试图用一个进行序列化,另一个进行反序列化。但我离题了。)