【问题标题】:JSON Schema validation with date fields带有日期字段的 JSON Schema 验证
【发布时间】:2016-03-15 17:04:11
【问题描述】:

我在使用 Newtonsoft.Json.Schema 库中的 JSchemaValidatingReader 时遇到问题。问题在于验证 JSON 数据中的日期字段。

鉴于此架构和数据

var schemaString = "{\"type\":\"object\",\"properties\":{\"DueDate\":{\"required\":true,\"type\":\"string\",\"format\":\"date\"},\"DateCompleted\":{\"required\":true,\"type\":\"string\",\"format\":\"date-time\"}}}";
var jsonData = "{\"DueDate\":\"2015-08-25\",\"DateCompleted\":\"2015-08-27T22:40:09.3749084-05:00\"}";

我可以使用 JToken.IsValid() 方法正确验证数据。像这样:

IList<string> errors = new List<string>();
var schema = JSchema.Parse(schemaString);
var json = JToken.Parse(jsonData);
var isValid = json.IsValid(schema, out errors); //isValid = true with no errors

但是,如果我尝试使用 JSchemaValidatingReader 完成相同的事情,我会得到不同的结果。

var jsonReader = new JsonTextReader(new StringReader(jsonData));
var validatingReader = new JSchemaValidatingReader(jsonReader);
validatingReader.Schema = schema;
validatingReader.ValidationEventHandler += (o, a) => errors.Add(a.Path + ": " + a.Message);

var serializer = new JsonSerializer();
var hw = serializer.Deserialize<Homework>(validatingReader);

这将导致错误列表包含错误消息:

DueDate:字符串“2015-08-25T00:00:00”不针对“日期”格式进行验证。路径“DueDate”,第 1 行,位置 23。

不知何故,时间部分被添加到日期字符串中。通过像这样设置 JsonTextReader.DateFormatString 属性可以避免这个错误:

jsonReader.DateFormatString = "yyyy-MM-dd";

但是,这只会导致日期时间字段无法验证并出现此错误:

DateCompleted:字符串“2015-08-27”未针对“日期时间”格式进行验证。路径“DateCompleted”,第 1 行,位置 75。

我做错了吗?还是 JSchemaValidatingReader 实现有问题?

【问题讨论】:

    标签: c# json json.net schema jsonschema


    【解决方案1】:

    这个问题是由JsonTextReader + 反序列化器将日期字符串解析为 DateTimes 引起的。一旦发生这种情况,原始字符串就会丢失,并且验证阅读器必须将 DateTime 转换回字符串,然后才能对其进行验证。 IsValid 不会发生这种情况,因为它将所有内容都读取为字符串。

    目前有两种解决方案:

    1. 坚持使用 IsValid 进行验证。
    2. JsonTextReader 上将 DateParseHandling 设置为 DateParseHandling.None。日期将始终被读取为字符串,并且序列化程序会将它们转换为 DateTime

    【讨论】:

      【解决方案2】:

      我认为,这是因为您有两种不同的日期格式,而JSchemaValidatingReader 只能处理您在jsonReader.DateFormatString 中提供的格式

      【讨论】:

      • 当然,JSON 模式同时包含日期字段和日期时间字段是有效/合理的。需要有一种方法来验证单个架构/文档中的两种类型的字段。
      • 不,问题不在于格式,而在于反序列化
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-29
      • 2014-06-13
      相关资源
      最近更新 更多