我正在使用 jsonLogic net 来验证输入数据。想要将输入日期与规则中定义的日期进行比较。但无法找到日期运算符。有没有办法在不解析输入数据的情况下比较日期?
我可以使用规则中定义的占位符来解析日期或当前日期。但如何将其与输入数据中提供的日期进行比较呢?
嗨,我对这个库不太熟悉,但我根据 github 库中的示例进行了快速单元测试。由于 json 中的日期只是字符串,如果您可以控制格式,我认为标准小于/大于运算符应该仍然有效,前提是时间以 UTC 和 24 小时格式标准化。
using FluentAssertions;
using JsonLogic.Net;
using Newtonsoft.Json.Linq;
namespace FunctionTesting.Json.JsonLogic;
public class JsonLogicTests
{
[Theory]
[MemberData(nameof(SampleTests))]
public void JsonLogic_TestDateEvaluator(string op, DateTime sampleDate, DateTime ruleDate, bool expectedResult)
{
//arrange
// The data that the rule will run against.
var format = "yyyyMMddTHH:mm:ss";
object data = new {MyDate = sampleDate.ToString(format)};
// Rule definition retrieved as JSON text
string jsonText=$"{{\"{op}\": [{{\"var\": \"MyDate\"}}, \"{ruleDate.ToString(format)}\"]}}";
var rule = JObject.Parse(jsonText);
var operators = EvaluateOperators.Default;
var evaluator = new JsonLogicEvaluator(operators);
// act
object result = evaluator.Apply(rule, data);
// assert
result.Should().BeOfType<bool>().And.Be(expectedResult);
}
public static IEnumerable<object[]> SampleTests()
{
var sampleDate = DateTime.UtcNow;
yield return new object[] { ">", sampleDate, sampleDate.AddDays(-1), true };
yield return new object[] { "<", sampleDate, sampleDate.AddDays(-1), false };
yield return new object[] { "<", sampleDate, sampleDate.AddDays(1), true };
yield return new object[] { ">", sampleDate, sampleDate.AddDays(1), false };
yield return new object[] { "==", sampleDate, sampleDate, true };
}
}
您应该能够为您的用例添加测试用例,但如果有限制,您可能必须添加自定义运算符,然后最终解析日期。