检查 Fluent Validation C# 中特定规则的状态

Checking the status of a specific rule in Fluent Validation C#

我是 fluent validation 的新手。我可以通过某种方式进行这样的验证:

public class GetPayloadQueryValidator: AbstractValidator<string?>
{
    public GetPayloadQueryValidator()
    {
        RuleFor(x => x).NotEmpty();
        RuleFor(x => x).NotEmpty().Must(x => isValidJSON(x));
        RuleFor(x => x).NotEmpty().Must(x => isValidRequest(x));
    }

    private bool isValidJSON(string? json)
    {
        try
        {
            JToken jsonToken = JObject.Parse(json);
            return true;
        }
        catch (Exception ex)
        {
            return false;
        }
    }

    private bool isValidRequest(string? json)
    {
        try
        {
            JObject? obj = JObject.Parse(json);

            if (!obj.HasValues)
            {
                return false;
            }

            if (!obj.ContainsKey("fixed") ||
                    !obj.ContainsKey("data") ||
                    !obj["data"].HasValues)
            {
                return false;
            }

            JObject? data = obj["data"].ToObject<JObject?>();

            if(!data.ContainsKey("templateName") || string.IsNullOrEmpty(data["templateName"].ToString()) || 
                !data.ContainsKey("primaryObjectName") || string.IsNullOrEmpty(data["primaryObjectName"].ToString()))
            {
                return false;
            }

            return true;
        }
        catch (Exception ex)
        {
            return false;
        }
    }
}

所以这里第一个验证器正在检查输入是否只是一个有效的 json。第二个验证器正在检查它是否包含少量属性。

这就是我使用它进行验证的方式。

GetPayloadQueryValidator? QV = new GetPayloadQueryValidator();

ValidationResult? validate = QV.Validate(request.orchestratorData);

if (!validate.IsValid)
{
    return JsonConvert.SerializeObject(new { Code = "400", Message = "Bad Request" }).ToString();
}

但这只是告诉我所有这些验证是否成功。但是,如果我需要检查给定的输入字符串是否有效 json(我不需要属性检查),我该如何完成。

更清楚的是,我需要知道一个有效的 json 而不是仅仅得到它满足所有条件。

请帮忙

您可以使用 WithErrorCode 方法说出违反了哪条规则。此外,您不需要在每一行都使用 NotEmpty 因为第一条规则会捕捉到它。例如:

public GetPayloadQueryValidator()
{
    RuleFor(x => x).NotEmpty().WithErrorCode("ERR1");
    RuleFor(x => x).Must(x => isValidJSON(x)).WithErrorCode("ERR2");
    RuleFor(x => x).Must(x => isValidRequest(x)).WithErrorCode("ERR3");
}

并且在您的验证码中:

ValidationResult? validate = QV.Validate("");

if (!validate.IsValid)
{
    Console.WriteLine("Not valid because:");
    foreach (var error in validate.Errors)
    {
        // This will print out "ERR1" or "ERR2 or "ERR3" or some combination of them all
        Console.WriteLine(error.ErrorCode);
    }
}

请注意,如果您在每个验证器之后省略 WithErrorCode 方法,您将获得代表该验证方法的代码。例如 NotEmpty 方法会给你 NotEmptyValidatorMust 会给你 PredicateValidator.