如何在json输入中验证集合DateTime的格式?

时间:2018-12-27 15:41:29

标签: c# json json.net

我知道如何使用注释来验证特定格式的DateTime。 我知道如何验证DateTime的集合(确保它们都有效)。

我找不到如何验证输入的json中集合中所有DateTimes是否具有特定格式的信息。

我需要验证在IList的{​​{1}}中,所有日期都与格式DateTime相匹配。

我尝试了使用重写的"yyyy-MM-dd"函数的自定义类属性。

不起作用,因为我收到的对象已经是IsValid,且DateTimes已为输入的json字符串转换。

json输入Enumerable<DateTime>无效,但是当我检查格式是否正确时(在IsValid中),"DatesList": ["2012-10-01", "2012-10"]已转换为日期值为"2012-10"的DateTime。功能)。

当我需要使用我的可重用属性来检查json中所有输入的日期是否有效时,这是json反序列化的目标类。

2012-10-01

然后我尝试使用属性函数:

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;

namespace XXX
{
    /// <summary>
    /// Handles a Forex Rate and its history
    /// </summary>
    public class FxRate : IExamplesProvider
    {
        /// <summary>
        /// Base currency of the Forex Rate
        /// </summary>
        [Required]
        [RegularExpression("^[a-zA-Z]{3}$", ErrorMessage = "bla")]
        public string BaseCurrency { get; set; }

        /// <summary>
        /// Target currency of the Forex Rate
        /// </summary>
        [Required]
        [RegularExpression("^[a-zA-Z]{3}$", ErrorMessage = "bla")]
        public string TargetCurrency { get; set; }

        /// <summary>
        /// List of dates 
        /// </summary>
        [Required]
        [EnsureValidHistoryDates]
        public IList<DateTime> Dates { get; set; }
    }
}

任何一种使用属性注释来验证T上具有特定格式的类型的集合的通用方法都将非常受欢迎,因为我被困在这里(并且我在Google上尝试了很多不同的搜索方式)。

1 个答案:

答案 0 :(得分:1)

List<DateTime> validDates = new List<DateTime>();
List<DateTime> invalidDates = new List<DateTime>();

List<string> dateTimes = new List<string>() {
    "20181227",
    "2018-12-27",
    "27/12/2018",
    "12/27/2018"
}; //INSTEAD OF DECLARING THE DATES, THERE SHOULD BE THE CONVERSION FROM JSON TO STRINGS LIST    

foreach(string dateTime in dateTimes)
{
    bool isValid = DateTime.TryParseExact(dateTime, "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime result);

    if (isValid)
    {
        validDates.Add(result);
    }
    else
    {
        invalidDates.Add(result);
    }
}