VVJSONSchemaValidation 1.6.0

VVJSONSchemaValidation 1.6.0

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布上次发布2020年3月

Vlas Voloshin维护。



VVJSONSchemaValidation

JSON Schema draft 4解析和验证库,用Objective-C编写。

Carthage compatible CocoaPods CocoaPods CocoaPods

VVJSONSchemaValidation是一个库,它提供了一组类来将JSON Schema draft 4文档解析到本机Objective-C对象中,并将其用于验证JSON文档。

该库的主要功能是能够“编译”模式到一个描述该模式的对象网络,使其可以缓存和重用,以便以性能方式验证多个JSON文档,类似于NSRegularExpressionNSDateFormatter类被使用的方式。该库的可能用途之一是在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

  1. 将以下行添加到您的 Cartfile

    github "vlas-voloshin/JSONSchemaValidation"
    
  2. 按照Carthage文档中的说明构建并将库集成到您的应用中。

  3. 在源文件中导入库头文件

    • Objective-C: #import <VVJSONSchemaValidation/VVJSONSchemaValidation.h>
    • Swift: import VVJSONSchemaValidation

CocoaPods

  1. 将以下行添加到您的 Podfile

    pod 'VVJSONSchemaValidation'
    
  2. 在源文件中导入库头文件

    • Objective-C: #import <VVJSONSchemaValidation/VVJSONSchema.h>
    • Swift: import VVJSONSchemaValidation

框架(iOS、tvOS 和 macOS)

  1. 下载并将仓库源文件复制到您的项目中,或者将其添加为子模块到您的 git 仓库中。
  2. VVJSONSchemaValidation.xcodeproj 拖放到 Xcode 中的项目或工作区。
  3. 在项目设置的“常规”选项卡中,点击 Your Target,您可能发现 Xcode 在“嵌入式二进制文件”中添加了缺失的框架项。现在先删除它。
  4. 仍在“常规”选项卡中,添加 VVJSONSchemaValidation.framework(从 VVJSONSchemaValidation-iOSVVJSONSchemaValidation-tvOSVVJSONSchemaValidation-OSX 目标,具体取决于您的目标平台)到“嵌入式二进制文件”。这也应该将它添加到“链接框架和库”。
  5. 在源文件中导入库头文件
    • Objective-C: #import <VVJSONSchemaValidation/VVJSONSchemaValidation.h>
    • Swift: import VVJSONSchemaValidation

静态库(iOS)

  1. 下载并将仓库源文件复制到您的项目中,或者将其添加为子模块到您的 git 仓库中。
  2. VVJSONSchemaValidation.xcodeproj 拖放到 Xcode 中的项目或工作区。
  3. 在项目设置的“常规”部分中,点击 Your Target,您可能发现 Xcode 在“嵌入式二进制文件”中添加了缺失的框架项。现在先删除它。
  4. 仍然在“常规”选项卡中,将libVVJSONSchemaValidation.a添加到“链接框架和库”中。
  5. 将项目路径添加到您的目标 → 编译设置 → 标头搜索路径(例如"$(SRCROOT)/MyAwesomeProject/Vendor/VVJSONSchemaValidation/")。
  6. -ObjC标志添加到您的目标 → 编译设置 → 其他连接器标志,以确保加载静态库中定义的分类。
  7. 在源文件中导入库头文件
    • Objective-C: #import <VVJSONSchemaValidation/VVJSONSchema.h>
    • Swift: import VVJSONSchemaValidation

源文件

  1. 下载并将仓库源文件复制到您的项目中,或者将其添加为子模块到您的 git 仓库中。
  2. VVJSONSchemaValidation目录的内容添加到Xcode中的项目中。
  3. 导入库头文件:#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字典中将包含以下密钥

  • VVJSONSchemaErrorFailingObjectKeyobject)-包含失败验证的对象的JSON表示。
  • VVJSONSchemaErrorFailingValidatorKeyvalidator)-引用失败的验证器对象。其描述包含其类和验证参数。
  • VVJSONSchemaErrorFailingObjectPathKeypath)-以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 文件。