版本260406
This commit is contained in:
85
OrpaonVision.Core/Validation/IJsonSchemaValidator.cs
Normal file
85
OrpaonVision.Core/Validation/IJsonSchemaValidator.cs
Normal file
@@ -0,0 +1,85 @@
|
||||
using OrpaonVision.Core.Results;
|
||||
using OrpaonVision.Core.Validation;
|
||||
|
||||
namespace OrpaonVision.Core.Validation;
|
||||
|
||||
/// <summary>
|
||||
/// JSON Schema验证服务接口。
|
||||
/// </summary>
|
||||
public interface IJsonSchemaValidator
|
||||
{
|
||||
/// <summary>
|
||||
/// 验证JSON字符串是否符合指定Schema。
|
||||
/// </summary>
|
||||
/// <param name="jsonString">要验证的JSON字符串。</param>
|
||||
/// <param name="schemaType">Schema类型。</param>
|
||||
/// <param name="schemaVersion">Schema版本。</param>
|
||||
/// <param name="cancellationToken">取消令牌。</param>
|
||||
/// <returns>验证结果。</returns>
|
||||
Task<Result<JsonSchemaValidationResult>> ValidateAsync(string jsonString, string schemaType, string schemaVersion = "1.0", CancellationToken cancellationToken = default);
|
||||
|
||||
/// <summary>
|
||||
/// 验证配置快照JSON。
|
||||
/// </summary>
|
||||
/// <param name="snapshotJson">快照JSON字符串。</param>
|
||||
/// <param name="snapshotType">快照类型。</param>
|
||||
/// <param name="cancellationToken">取消令牌。</param>
|
||||
/// <returns>验证结果。</returns>
|
||||
Task<Result<JsonSchemaValidationResult>> ValidateSnapshotAsync(string snapshotJson, string snapshotType, CancellationToken cancellationToken = default);
|
||||
|
||||
/// <summary>
|
||||
/// 验证规则配置JSON。
|
||||
/// </summary>
|
||||
/// <param name="ruleJson">规则JSON字符串。</param>
|
||||
/// <param name="ruleType">规则类型。</param>
|
||||
/// <param name="cancellationToken">取消令牌。</param>
|
||||
/// <returns>验证结果。</returns>
|
||||
Task<Result<JsonSchemaValidationResult>> ValidateRuleAsync(string ruleJson, string ruleType, CancellationToken cancellationToken = default);
|
||||
|
||||
/// <summary>
|
||||
/// 验证推理结果JSON。
|
||||
/// </summary>
|
||||
/// <param name="inferenceJson">推理结果JSON字符串。</param>
|
||||
/// <param name="modelType">模型类型。</param>
|
||||
/// <param name="cancellationToken">取消令牌。</param>
|
||||
/// <returns>验证结果。</returns>
|
||||
Task<Result<JsonSchemaValidationResult>> ValidateInferenceResultAsync(string inferenceJson, string modelType, CancellationToken cancellationToken = default);
|
||||
|
||||
/// <summary>
|
||||
/// 获取支持的Schema类型列表。
|
||||
/// </summary>
|
||||
/// <param name="cancellationToken">取消令牌。</param>
|
||||
/// <returns>Schema类型列表。</returns>
|
||||
Task<Result<IReadOnlyList<string>>> GetSupportedSchemaTypesAsync(CancellationToken cancellationToken = default);
|
||||
|
||||
/// <summary>
|
||||
/// 获取Schema定义。
|
||||
/// </summary>
|
||||
/// <param name="schemaType">Schema类型。</param>
|
||||
/// <param name="schemaVersion">Schema版本。</param>
|
||||
/// <param name="cancellationToken">取消令牌。</param>
|
||||
/// <returns>Schema定义。</returns>
|
||||
Task<Result<string>> GetSchemaAsync(string schemaType, string schemaVersion = "1.0", CancellationToken cancellationToken = default);
|
||||
|
||||
/// <summary>
|
||||
/// 验证并转换JSON为强类型对象。
|
||||
/// </summary>
|
||||
/// <typeparam name="T">目标类型。</typeparam>
|
||||
/// <param name="jsonString">JSON字符串。</param>
|
||||
/// <param name="schemaType">Schema类型。</param>
|
||||
/// <param name="schemaVersion">Schema版本。</param>
|
||||
/// <param name="cancellationToken">取消令牌。</param>
|
||||
/// <returns>转换结果。</returns>
|
||||
Task<Result<T>> ValidateAndDeserializeAsync<T>(string jsonString, string schemaType, string schemaVersion = "1.0", CancellationToken cancellationToken = default) where T : class;
|
||||
|
||||
/// <summary>
|
||||
/// 验证强类型对象并序列化为JSON。
|
||||
/// </summary>
|
||||
/// <typeparam name="T">源类型。</typeparam>
|
||||
/// <param name="obj">要验证的对象。</param>
|
||||
/// <param name="schemaType">Schema类型。</param>
|
||||
/// <param name="schemaVersion">Schema版本。</param>
|
||||
/// <param name="cancellationToken">取消令牌。</param>
|
||||
/// <returns>序列化结果。</returns>
|
||||
Task<Result<string>> ValidateAndSerializeAsync<T>(T obj, string schemaType, string schemaVersion = "1.0", CancellationToken cancellationToken = default) where T : class;
|
||||
}
|
||||
205
OrpaonVision.Core/Validation/JsonSchemaConstants.cs
Normal file
205
OrpaonVision.Core/Validation/JsonSchemaConstants.cs
Normal file
@@ -0,0 +1,205 @@
|
||||
namespace OrpaonVision.Core.Validation;
|
||||
|
||||
/// <summary>
|
||||
/// JSON Schema类型常量。
|
||||
/// </summary>
|
||||
public static class JsonSchemaTypes
|
||||
{
|
||||
/// <summary>
|
||||
/// 机种配置快照Schema。
|
||||
/// </summary>
|
||||
public const string ProductTypeSnapshot = "ProductTypeSnapshot";
|
||||
|
||||
/// <summary>
|
||||
/// 规则配置快照Schema。
|
||||
/// </summary>
|
||||
public const string RuleConfigurationSnapshot = "RuleConfigurationSnapshot";
|
||||
|
||||
/// <summary>
|
||||
/// 层级配置Schema。
|
||||
/// </summary>
|
||||
public const string LayerConfiguration = "LayerConfiguration";
|
||||
|
||||
/// <summary>
|
||||
/// 部件配置Schema。
|
||||
/// </summary>
|
||||
public const string PartConfiguration = "PartConfiguration";
|
||||
|
||||
/// <summary>
|
||||
/// ROI配置Schema。
|
||||
/// </summary>
|
||||
public const string RoiConfiguration = "RoiConfiguration";
|
||||
|
||||
/// <summary>
|
||||
/// 推理结果Schema。
|
||||
/// </summary>
|
||||
public const string InferenceResult = "InferenceResult";
|
||||
|
||||
/// <summary>
|
||||
/// 检测结果Schema。
|
||||
/// </summary>
|
||||
public const string DetectionResult = "DetectionResult";
|
||||
|
||||
/// <summary>
|
||||
/// 运行状态Schema。
|
||||
/// </summary>
|
||||
public const string RuntimeState = "RuntimeState";
|
||||
|
||||
/// <summary>
|
||||
/// 产品会话Schema。
|
||||
/// </summary>
|
||||
public const string ProductSession = "ProductSession";
|
||||
|
||||
/// <summary>
|
||||
/// 异常记录Schema。
|
||||
/// </summary>
|
||||
public const string AbnormalRecord = "AbnormalRecord";
|
||||
|
||||
/// <summary>
|
||||
/// 训练任务Schema。
|
||||
/// </summary>
|
||||
public const string TrainingJob = "TrainingJob";
|
||||
|
||||
/// <summary>
|
||||
/// 数据集版本Schema。
|
||||
/// </summary>
|
||||
public const string DatasetVersion = "DatasetVersion";
|
||||
|
||||
/// <summary>
|
||||
/// 模型包Schema。
|
||||
/// </summary>
|
||||
public const string ModelPackage = "ModelPackage";
|
||||
|
||||
/// <summary>
|
||||
/// 用户配置Schema。
|
||||
/// </summary>
|
||||
public const string UserConfiguration = "UserConfiguration";
|
||||
|
||||
/// <summary>
|
||||
/// 审计日志Schema。
|
||||
/// </summary>
|
||||
public const string AuditLog = "AuditLog";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// JSON Schema版本常量。
|
||||
/// </summary>
|
||||
public static class JsonSchemaVersions
|
||||
{
|
||||
/// <summary>
|
||||
/// 当前版本。
|
||||
/// </summary>
|
||||
public const string Current = "1.0";
|
||||
|
||||
/// <summary>
|
||||
/// 初始版本。
|
||||
/// </summary>
|
||||
public const string V1_0 = "1.0";
|
||||
|
||||
/// <summary>
|
||||
/// 向后兼容的最低版本。
|
||||
/// </summary>
|
||||
public const string MinimumCompatible = "1.0";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// JSON Schema验证错误代码。
|
||||
/// </summary>
|
||||
public static class JsonSchemaErrorCodes
|
||||
{
|
||||
/// <summary>
|
||||
/// JSON格式错误。
|
||||
/// </summary>
|
||||
public const string InvalidJsonFormat = "INVALID_JSON_FORMAT";
|
||||
|
||||
/// <summary>
|
||||
/// Schema版本不支持。
|
||||
/// </summary>
|
||||
public const string UnsupportedSchemaVersion = "UNSUPPORTED_SCHEMA_VERSION";
|
||||
|
||||
/// <summary>
|
||||
/// 必需字段缺失。
|
||||
/// </summary>
|
||||
public const string RequiredFieldMissing = "REQUIRED_FIELD_MISSING";
|
||||
|
||||
/// <summary>
|
||||
/// 字段类型不匹配。
|
||||
/// </summary>
|
||||
public const string FieldTypeMismatch = "FIELD_TYPE_MISMATCH";
|
||||
|
||||
/// <summary>
|
||||
/// 字段值超出范围。
|
||||
/// </summary>
|
||||
public const string FieldValueOutOfRange = "FIELD_VALUE_OUT_OF_RANGE";
|
||||
|
||||
/// <summary>
|
||||
/// 枚举值无效。
|
||||
/// </summary>
|
||||
public const string InvalidEnumValue = "INVALID_ENUM_VALUE";
|
||||
|
||||
/// <summary>
|
||||
/// 数组长度超出限制。
|
||||
/// </summary>
|
||||
public const string ArrayLengthExceeded = "ARRAY_LENGTH_EXCEEDED";
|
||||
|
||||
/// <summary>
|
||||
/// 字符串长度超出限制。
|
||||
/// </summary>
|
||||
public const string StringLengthExceeded = "STRING_LENGTH_EXCEEDED";
|
||||
|
||||
/// <summary>
|
||||
/// 引用对象不存在。
|
||||
/// </summary>
|
||||
public const string ReferenceNotFound = "REFERENCE_NOT_FOUND";
|
||||
|
||||
/// <summary>
|
||||
/// 循环引用。
|
||||
/// </summary>
|
||||
public const string CircularReference = "CIRCULAR_REFERENCE";
|
||||
|
||||
/// <summary>
|
||||
/// 依赖字段缺失。
|
||||
/// </summary>
|
||||
public const string DependencyFieldMissing = "DEPENDENCY_FIELD_MISSING";
|
||||
|
||||
/// <summary>
|
||||
/// 条件验证失败。
|
||||
/// </summary>
|
||||
public const string ConditionalValidationFailed = "CONDITIONAL_VALIDATION_FAILED";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// JSON Schema验证警告代码。
|
||||
/// </summary>
|
||||
public static class JsonSchemaWarningCodes
|
||||
{
|
||||
/// <summary>
|
||||
/// 使用了已弃用的字段。
|
||||
/// </summary>
|
||||
public const string DeprecatedFieldUsed = "DEPRECATED_FIELD_USED";
|
||||
|
||||
/// <summary>
|
||||
/// 字段值为默认值。
|
||||
/// </summary>
|
||||
public const string FieldUsingDefaultValue = "FIELD_USING_DEFAULT_VALUE";
|
||||
|
||||
/// <summary>
|
||||
/// 可选字段未提供。
|
||||
/// </summary>
|
||||
public const string OptionalFieldNotProvided = "OPTIONAL_FIELD_NOT_PROVIDED";
|
||||
|
||||
/// <summary>
|
||||
/// 字段值可能不是最优的。
|
||||
/// </summary>
|
||||
public const string SuboptimalFieldValue = "SUBOPTIMAL_FIELD_VALUE";
|
||||
|
||||
/// <summary>
|
||||
/// 性能警告。
|
||||
/// </summary>
|
||||
public const string PerformanceWarning = "PERFORMANCE_WARNING";
|
||||
|
||||
/// <summary>
|
||||
/// 安全警告。
|
||||
/// </summary>
|
||||
public const string SecurityWarning = "SECURITY_WARNING";
|
||||
}
|
||||
109
OrpaonVision.Core/Validation/JsonSchemaValidationResult.cs
Normal file
109
OrpaonVision.Core/Validation/JsonSchemaValidationResult.cs
Normal file
@@ -0,0 +1,109 @@
|
||||
namespace OrpaonVision.Core.Validation;
|
||||
|
||||
/// <summary>
|
||||
/// JSON Schema验证结果。
|
||||
/// </summary>
|
||||
public sealed class JsonSchemaValidationResult
|
||||
{
|
||||
/// <summary>
|
||||
/// 是否验证通过。
|
||||
/// </summary>
|
||||
public bool IsValid { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 验证错误列表。
|
||||
/// </summary>
|
||||
public IReadOnlyList<JsonSchemaValidationError> Errors { get; init; } = [];
|
||||
|
||||
/// <summary>
|
||||
/// 警告列表。
|
||||
/// </summary>
|
||||
public IReadOnlyList<JsonSchemaValidationWarning> Warnings { get; init; } = [];
|
||||
|
||||
/// <summary>
|
||||
/// 验证耗时(毫秒)。
|
||||
/// </summary>
|
||||
public long ValidationTimeMs { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// Schema版本。
|
||||
/// </summary>
|
||||
public string SchemaVersion { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 验证时间(UTC)。
|
||||
/// </summary>
|
||||
public DateTime ValidatedAtUtc { get; init; } = DateTime.UtcNow;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// JSON Schema验证错误。
|
||||
/// </summary>
|
||||
public sealed class JsonSchemaValidationError
|
||||
{
|
||||
/// <summary>
|
||||
/// 错误代码。
|
||||
/// </summary>
|
||||
public string Code { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 错误消息。
|
||||
/// </summary>
|
||||
public string Message { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 错误路径。
|
||||
/// </summary>
|
||||
public string Path { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 错误严重程度。
|
||||
/// </summary>
|
||||
public string Severity { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 期望值。
|
||||
/// </summary>
|
||||
public string? ExpectedValue { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 实际值。
|
||||
/// </summary>
|
||||
public string? ActualValue { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 修复建议。
|
||||
/// </summary>
|
||||
public string? Suggestion { get; init; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// JSON Schema验证警告。
|
||||
/// </summary>
|
||||
public sealed class JsonSchemaValidationWarning
|
||||
{
|
||||
/// <summary>
|
||||
/// 警告代码。
|
||||
/// </summary>
|
||||
public string Code { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 警告消息。
|
||||
/// </summary>
|
||||
public string Message { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 警告路径。
|
||||
/// </summary>
|
||||
public string Path { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 警告级别。
|
||||
/// </summary>
|
||||
public string Level { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 建议操作。
|
||||
/// </summary>
|
||||
public string? Recommendation { get; init; }
|
||||
}
|
||||
Reference in New Issue
Block a user