Manatee.Json 获得人类可读的 SchemaValidationResults 输出

Manatee.Json get human readable SchemaValidationResults output

如何以人类可读的格式(例如 JSON)打印 SchemaValidationResults? Documentation page 讨论了不同的输出格式 (JsonSchemaOptions.OutputFormat 属性),但我不知道如何进行文本表示。

我的代码具有以下模式:

JsonSchema schema = _SchemaReader.Get(schemaPath);
JsonValue json = JsonValue.Parse(jsonDoc);
SchemaValidationResults validationResult = schema.Validate(json, new JsonSchemaOptions()
{
    OutputFormat = SchemaValidationOutputFormat.Detailed
});

validationResult.Should().BeValid(); // Custom FluentAssertions extension

自定义FluentAssertions扩展代码:

// Subject is SchemaValidationResults
Execute.Assertion.
    Given(() => Subject).
    ForCondition(s => s.IsValid).
    FailWith("Validation Errors: {0}", Subject.ErrorMessage);

但得到的错误信息是:"Items at indices [2,4] failed validation."但我想看到更全面的输出。

输出是 2019-09 草案的递归结构。这意味着进一步的结果包含在顶级结构中。

在您的情况下,您正在查找错误,因此您需要查看 validationResult.NestedResults(之前的编辑有 .Errors)属性。您可以在这里找到所需的其他详细信息。


或者,您可以通过设置 JsonSchemaOptions.OutputFormat = SchemaValidationOutputFormat.Basic; 将输出格式更改为平面列表。这也是规范中详述的输出格式之一。

对于我的情况,我通过以下方式获得验证错误列表。

public static List<string> GetValidationErrors(SchemaValidationResults validationResult)
{
    if (validationResult.IsValid)
    {
        return new List<string>(0);
    }

    var errorList = new List<string>(8);
    if (!string.IsNullOrWhiteSpace(validationResult.ErrorMessage))
    {
        errorList.Add(validationResult.ErrorMessage);
    }

    foreach (SchemaValidationResults vrslt in validationResult.NestedResults)
    {
        errorList.AddRange(GetValidationErrors(vrslt));
    }
    return errorList;
}