VVJSONSchemaValidation
JSON Schema draft 4解析和验证库,用Objective-C编写。
VVJSONSchemaValidation
是一个库,它提供了一组类来将JSON Schema draft 4文档解析到本机Objective-C对象中,并将其用于验证JSON文档。
该库的主要功能是能够“编译”模式到一个描述该模式的对象网络,使其可以缓存和重用,以便以性能方式验证多个JSON文档,类似于NSRegularExpression
和NSDateFormatter
类被使用的方式。该库的可能用途之一是在JSON Schema形式中描述的应用程序中基于期望进行提前验证从网络服务收到的JSON响应。
VVJSONSchemaValidation
支持JSON Schema draft 4的所有验证关键字。还可以通过定义自定义关键字来扩展库的功能,这些关键字与特定的元模式URIs和自定义的format
验证关键字的格式一起使用。请注意,目前不支持JSON Schema draft 3。还有一些重要的限制,包括外部模式引用的使用,这些限制在注意事项和限制下面列出。
要求
VVJSONSchemaValidation
支持在ARC启用的情况下使用Xcode 8.0或更高版本来构建。最低支持的目标平台版本是iOS 8.0,tvOS 9.0和OS X 10.9。库可以链接到Objective-C和Swift目标。
安装
Carthage
-
将以下行添加到您的
Cartfile
github "vlas-voloshin/JSONSchemaValidation"
-
按照Carthage文档中的说明构建并将库集成到您的应用中。
-
在源文件中导入库头文件
- Objective-C:
#import <VVJSONSchemaValidation/VVJSONSchemaValidation.h>
- Swift:
import VVJSONSchemaValidation
- Objective-C:
CocoaPods
-
将以下行添加到您的
Podfile
pod 'VVJSONSchemaValidation'
-
在源文件中导入库头文件
- Objective-C:
#import <VVJSONSchemaValidation/VVJSONSchema.h>
- Swift:
import VVJSONSchemaValidation
- Objective-C:
框架(iOS、tvOS 和 macOS)
- 下载并将仓库源文件复制到您的项目中,或者将其添加为子模块到您的 git 仓库中。
- 将
VVJSONSchemaValidation.xcodeproj
拖放到 Xcode 中的项目或工作区。 - 在项目设置的“常规”选项卡中,点击
Your Target
,您可能发现 Xcode 在“嵌入式二进制文件”中添加了缺失的框架项。现在先删除它。 - 仍在“常规”选项卡中,添加
VVJSONSchemaValidation.framework
(从VVJSONSchemaValidation-iOS
、VVJSONSchemaValidation-tvOS
或VVJSONSchemaValidation-OSX
目标,具体取决于您的目标平台)到“嵌入式二进制文件”。这也应该将它添加到“链接框架和库”。 - 在源文件中导入库头文件
- Objective-C:
#import <VVJSONSchemaValidation/VVJSONSchemaValidation.h>
- Swift:
import VVJSONSchemaValidation
- Objective-C:
静态库(iOS)
- 下载并将仓库源文件复制到您的项目中,或者将其添加为子模块到您的 git 仓库中。
- 将
VVJSONSchemaValidation.xcodeproj
拖放到 Xcode 中的项目或工作区。 - 在项目设置的“常规”部分中,点击
Your Target
,您可能发现 Xcode 在“嵌入式二进制文件”中添加了缺失的框架项。现在先删除它。 - 仍然在“常规”选项卡中,将
libVVJSONSchemaValidation.a
添加到“链接框架和库”中。 - 将项目路径添加到
您的目标
→ 编译设置 → 标头搜索路径(例如"$(SRCROOT)/MyAwesomeProject/Vendor/VVJSONSchemaValidation/"
)。 - 将
-ObjC
标志添加到您的目标
→ 编译设置 → 其他连接器标志,以确保加载静态库中定义的分类。 - 在源文件中导入库头文件
- Objective-C:
#import <VVJSONSchemaValidation/VVJSONSchema.h>
- Swift:
import VVJSONSchemaValidation
- Objective-C:
源文件
- 下载并将仓库源文件复制到您的项目中,或者将其添加为子模块到您的 git 仓库中。
- 将
VVJSONSchemaValidation
目录的内容添加到Xcode中的项目中。 - 导入库头文件:
#import "VVJSONSchema.h"
。
用法
在导入库头文件/模块后,使用VVJSONSchema
类从NSData
实例构建方案对象
NSData *schemaData = [NSData dataWithContentsOfURL:mySchemaURL];
NSError *error = nil;
VVJSONSchema *schema = [VVJSONSchema schemaWithData:schemaData baseURI:nil referenceStorage:nil error:&error];
let schemaData = try Data(contentsOf: mySchemaURL)
let schema = try VVJSONSchema(data: schemaData, baseURI: nil, referenceStorage: nil)
或从解析后的JSON实例
NSData *schemaData = [NSData dataWithContentsOfURL:mySchemaURL];
// note that this object might be not an NSDictionary if schema JSON is invalid
NSDictionary *schemaJSON = [NSJSONSerialization JSONObjectWithData:schemaData options:0 error:NULL];
NSError *error = nil;
VVJSONSchema *schema = [VVJSONSchema schemaWithDictionary:schemaJSON baseURI:nil referenceStorage:nil error:&error];
let schemaData = try Data(contentsOf: mySchemaURL)
let schemaJSON = try JSONSerialization.jsonObject(with: schemaData, options: [])
if let schemaDictionary = schemaJSON as? [String: Any] {
let schema = try VVJSONSchema(dictionary: schemaDictionary, baseURI: nil, referenceStorage: nil)
}
baseURI
参数指定构建的方案的基作用域解析URI。默认作用域解析URI为空。可选的referenceStorage
参数指定一个应包含实例化的方案中引用的“远程”方案的VVJSONSchemaStorage
对象。有关详细信息,请参阅方案存储和外部引用。
构建方案对象后,您可以使用它来验证JSON实例。同样,这些实例可以是提供的
NSData *jsonData = [NSData dataWithContentsOfURL:myJSONURL];
NSError *validationError = nil;
BOOL success = [schema validateObjectWithData:jsonData error:&validationError];
let jsonData = try Data(contentsOf: myJSONURL)
try schema.validateObject(with: jsonData)
或解析后的JSON实例
NSData *jsonData = [NSData dataWithContentsOfURL:myJSONURL];
id json = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:NULL];
NSError *validationError = nil;
BOOL success = [schema validateObject:json error:&validationError];
let jsonData = try Data(contentsOf: myJSONURL)
let json = try JSONSerialization.jsonObject(with: jsonData, options: [])
try schema.validate(json)
如果验证失败,则NSError
对象在其userInfo
字典中将包含以下密钥
VVJSONSchemaErrorFailingObjectKey
(object
)-包含失败验证的对象的JSON表示。VVJSONSchemaErrorFailingValidatorKey
(validator
)-引用失败的验证器对象。其描述包含其类和验证参数。VVJSONSchemaErrorFailingObjectPathKey
(path
)-以JSON指针的形式包含失败对象的完整路径。空路径表示根级对象失败验证。
方案存储和外部引用
VVJSONSchema
故意不支持从网络位置解析外部方案引用。然而,可以使用VVJSONSchemaStorage
类提供这些外部引用。例如,如果方案A在http://awesome.org/myHandySchema.json
引用方案B,则可以在前面下载后者,并在实例化方案A时提供它
// obviously, in a real application, data from a website must not be loaded synchronously like this
NSURL *schemaBURL = [NSURL URLWithString:@"http://awesome.org/myHandySchema.json"];
NSData *schemaBData = [NSData dataWithContentsOfURL:schemaBURL];
VVJSONSchema *schemaB = [VVJSONSchema schemaWithData:schemaBData baseURI:schemaBURL referenceStorage:nil error:NULL];
VVJSONSchemaStorage *referenceStorage = [VVJSONSchemaStorage storageWithSchema:schemaB];
// ... retrieve schemaAData ...
VVJSONSchema *schemaA = [VVJSONSchema schemaWithData:schemaAData baseURI:nil referenceStorage:referenceStorage error:NULL];
VVJSONSchemaStorage
对象还可以用于存储方案并根据它们的范围URI检索它们。有关更多信息,请参阅源代码中该类的文档。
性能
请注意,从JSON表示中构建VVJSONSchema
对象在复杂模式的情况下会产生一些计算成本。因此,如果期望单个模式被多次用于验证,请确保缓存并重用相应的VVJSONSchema
对象。
在iPhone 5s上,VVJSONSchema
在实例化和验证中等复杂度模式时表现出以下性能(请参阅advanced-example.json)
操作 | 最小 | 平均 | 最大 |
---|---|---|---|
实例化 + 验证 | 4 ms | 15 ms | 24 ms |
仅实例化 | 3 ms | 12 ms | 20 ms |
仅验证 | 1.2 ms | 3.5 ms | 5.8 ms |
项目使用大部分JSON Schema Test Suite来测试其功能。在2.3 GHz Intel Core i7处理器上运行该套件显示了以下性能
操作 | 时间 |
---|---|
单个套件实例化 | 16.2 ms |
平均套件实例化 | 10.9 ms |
首次套件验证 | 3.69 ms |
平均套件验证 | 3.44 ms |
扩展
使用+[VVJSONSchema registerValidatorClass:forMetaschemaURI:withError:]
方法,可以为指定的自定义元模式URI注册自定义JSON Schema关键字,该URI必须在实例化的根模式中的$schema
属性中存在。使用符合VVJSONSchemaValidator
协议的对象来验证模式关键字。有关更多信息,请参阅源代码中的VVJSONSchema
类文档。
使用+[VVJSONSchemaFormatValidator registerFormat:withRegularExpression:error:]
和+[VVJSONSchemaFormatValidator registerFormat:withBlock:error:]
方法,可以将自定义格式名称注册到内建format
关键字验证类中,以验证自定义格式,而无需修改库代码。有关更多信息,请参阅源代码中的VVJSONSchemaFormatValidator
类文档。
线程安全
VVJSONSchema
及其组成对象在构造后是不可变的,因此线程安全,所以可以使用单个模式在并行线程中验证多个JSON文档。也可以在单独的线程中构造多个VVJSONSchema
实例,只要没有线程在过程中尝试注册额外的模式关键字。
注意事项与限制
- 正则表达式模式使用
NSRegularExpression
进行验证,它使用 ICU 实现,而不是 ECMA 262。因此,不支持某些功能,例如后视匹配。 - 不支持从外部位置加载架构引用。有关详细信息,请参阅 架构存储和外部引用。
- 按照 JSON Reference 规范草稿,架构引用(具有“$ref”属性的对象)内定义的架构关键字将被忽略。
许可
VVJSONSchemaValidation
在 MIT 许可下提供。有关更多信息,请参阅 LICENSE 文件。