用户可以使用/
或-
作为分隔符的格式输入日期。
以下try
块适用于/
,但不适用于-
,反之亦然:
Try
{
caseData.AddRange(
JsonConvert.DeserializeObject<List<CaseInfo>>(
jObject["caseData"].ToString(),
new JsonSerializerSettings { DateFormatString = "d/M/yyyy" }));
}
Catch(Exception)
{
caseData.AddRange(
JsonConvert.DeserializeObject<List<CaseInfo>>(
jObject["caseData"].ToString(),
new JsonSerializerSettings { DateFormatString = "d-M-yyyy" }));
}
简短的回答:否
A try-catch
结构在资源上非常昂贵。从设计的角度来看,这也是错误的。一个例外应该是:exception-异常,可能是错误。您在这里使用它的方式只是检查要使用的两种有效格式中的哪一种。
本质上,您在这里所做的是将异常处理用作计算量大的if-else
操作。
一个更好的解决方案可能是先尝试提取jObject["caseData"]
的内容,然后显式检查其格式以知道要使用哪个选项。一旦知道了,就可以使用常规的if-else
结构来决定如何对其进行反序列化。
类似:
var dateText = jObject["caseData"].ToString();
var matchingFormat = dateText.Contains("/") ? "d/M/yyyy" : "d-M-yyyy";
caseData.AddRange(
JsonConvert.DeserializeObject<List<CaseInfo>>(
jObject["caseData"].ToString(),
new JsonSerializerSettings { DateFormatString = matchingFormat }));
注:这是假设您有合理的把握,可以相信输入将采用两种格式之一。您可能需要添加更多验证,尤其是如果date字段是最终用户可以自由操作的内容。
@ Kjartan所说的加上以下内容。
如果您有多个日期字段并且用户以不同格式输入多个日期,则[DateFormatString
解决方案可能无法很好地工作。
以下是我可以考虑的一些选项,各有利弊:
CaseInfo
将日期存储为字符串并提供进行转换的访问器;JsonConverter
创建自定义DateTimeConverterBase,并用[JsonConverter(typeof(MyResilientDataFormatJsonConverter))]
标记您有问题的属性。一般说明:如果您支持多种格式和/或区域性,则解析日期将很快变得困难。例如:今天是10/09/2019还是09/10/2019?