RPJSONValidator 0.2.0

RPJSONValidator 0.2.0

测试测试
语言语言 Obj-CObjective C
许可证 MIT
发布上次发布2014年12月

Rey Gonzales维护。



  • 作者
  • Rey Gonzales

在映射之前验证JSON

给定

NSDictionary *json = @{
            @"phoneNumber" : @"123-555-6789",
            @"name" : @"Johnny Ringo",
            @"age" : @"BANANA",
            @"weight" : @"130.3",
            @"ssn" : [NSNull null],
            @"children" : @[],
            @"parents" : @[
                    @{
                            @"name" : @"Mickey"
                    },
                    @{
                            @"name" : @"Minnie"
                    }
            ]
    };

之前

BOOL validated = YES;

NSString *phoneNumber = [json objectForKey:@"phoneNumber"];
if(!phoneNumber || ![phoneNumber isKindOfClass:[NSString class] || [phoneNumber length] < 7) {
  NSLog(@"Phone number didn't validate (not found or not an NSString or length < 7)");
  validated = NO;
}

NSString *name = [json objectForKey:@"name"];
if(!name || ![phoneNumber isKindOfClass:[NSString class]) {
  NSLog(@"Phone number didn't validate (not found or not an NSString)");
  validated = NO;
}

NSNumber *age = [json objectForKey:@"age"];
if(age && ![age isKindOfClass:[NSNumber class]) {
  NSLog(@"Age exists but didn't validate (not an NSNumber)");
  validated = NO;
}

NSNumber *weight = [json objectForKey:@"weight"];
if(weight && ![weight isKindOfClass:[NSString class]) {
  NSLog(@"Weight exists but didn't validate (not an NSString)");
  validated = NO;
}

NSString *ssn = [json objectForKey:@"ssn"];
if(ssn != [NSNull null]) {
  NSLog(@"ssn should be null");
  validated = NO;
}

NSString *height = [json objectForKey:@"height"];
if(height && ![weight isKindOfClass:[NSString class]) {
  NSLog(@"Height exists but didn't validate (not an NSString)");
  validated = NO;
}

NSArray *children = [json objectForKey:@"children"];
if(children && ![children isKindOfClass:[NSArray class]) {
  NSLog(@"Children exists but didn't validate (not an NSArray)");
  validated = NO;
}

NSArray *parents = [json objectForKey:@"parents"];
if(parents && ![parents isKindOfClass:[NSArray class] && [parents count] <= 1) {
  NSLog(@"Parents exists but didn't validate (not an NSArray or count <= 1)");
  validated = NO;
}

之后

NSError *error;

[RPJSONValidator validateValuesFrom:json
                   withRequirements:@{
                           @"phoneNumber" : [RPValidatorPredicate.isString lengthIsGreaterThanOrEqualTo:@7],
                           @"name" : RPValidatorPredicate.isString,
                           @"age" : RPValidatorPredicate.isNumber.isOptional,
                           @"weight" : RPValidatorPredicate.isString,
                           @"ssn" : RPValidatorPredicate.isNull,
                           @"height" : RPValidatorPredicate.isString,
                           @"children" : RPValidatorPredicate.isArray,
                           @"parents" : [RPValidatorPredicate.isArray lengthIsGreaterThan:@1]
                   } error:&error];

if(error) {
    NSLog(@"%@", [RPJSONValidator prettyStringGivenRPJSONValidatorError:error]);
} else {
    NSLog(@"Woohoo, no errors!");
}

解释

每一对键值描述了每个JSON值的要求。例如,键值对 @"name" : RPValidatorPredicate.isString 将对具有键 "name" 的JSON值进行要求,要求该值为NSString。我们也可以链式要求。例如,@"age" : RPValidatorPredicate.isNumber.isOptional 将对 "age" 的值进行要求,要求该值为NSNumber,但前提是它在JSON中存在。

谓词

  • isOptional
    • 如果键存在,则仅评估其他谓词
  • hasSubstring:(NSString *)substring
    • 要求具有子串的NSString
  • isString
  • isNumber
  • isDictionary
  • isArray
  • isBoolean
  • isNull
    • 要求值 == [NSNull null]
  • isNotNull
    • 要求值 != [NSNull null]
  • validateValueWithBlock:(BOOL (^)(NSString *jsonKey, id jsonValue))block
    • 对于自定义验证,给定JSON键和相应的值(可能是nil,[NSNull null],NSNumber,NSArray,NSDictionary或NSString),如果有效则返回YES,如果无效则返回NO
  • lengthIsLessThan:(NSNumber *)value
  • lengthIsLessThanOrEqualTo:(NSNumber *)value
  • lengthIsEqualTo:(NSNumber *)value
  • lengthIsNotEqualTo:(NSNumber *)value
  • lengthIsGreaterThanOrEqualTo:(NSNumber *)value
  • lengthIsGreaterThan:(NSNumber *)value
  • valueIsLessThan:(NSNumber *)value
  • valueIsLessThanOrEqualTo:(NSNumber *)value
  • valueIsEqualTo:(NSNumber *)value
  • valueIsNotEqualTo:(NSNumber *)value
  • valueIsGreaterThanOrEqualTo:(NSNumber *)value
  • valueIsGreaterThan:(NSNumber *)value
  • matchesRegularExpression:(NSRegularExpression *)expression

等等!

格式化打印

NSDictionary *json = @{...};
NSError *error;

[RPJSONValidator validateValuesFrom:json
                   withRequirements:@{...}
                              error:&error];

NSLog(@"%@", [RPJSONValidator prettyStringGivenRPJSONValidatorError:error];

// Output:
// 2014-03-19 23:08:02.451 RPJSONValidator[42273:60b] 
// * age
//      * Requires NSNumber, given (__NSCFConstantString)
// * height
//      * Key not found
// * parents
//      * Requires NSString, given (__NSArrayI)
//      * Requires length or count less than or equal to (3)

子JSON验证

NSDictionary *json = @{
        @"car" : @{
                @"make" : @"Ford",
                @"model" : @"Mustang"
        },
};

[RPJSONValidator validateValuesFrom:json
                           withRequirements:@{
                                   @"car" : @{
                                           @"make" : [RPValidatorPredicate valueIsEqualTo:@"Ford"],
                                           @"model" : [RPValidatorPredicate valueIsEqualTo:@"Mustang"]
                                   }
                                      error:&error]

按索引验证

NSDictionary *json = @{
        @"cars" : @[
            @{
                 @"make" : @"Ford",
                 @"model" : @"Mustang"
            },
            @{
                 @"make" : "Tesla Motors",
                 @"model" : "Model S"
            },
            ...
        ],
};

[RPJSONValidator validateValuesFrom:json
                           withRequirements:@{
                                   @"cars" : @{
                                        @0 : @{ // Access the first element
                                             @"make" : RPValidatorPredicate.isString,
                                             @"model" : RPValidatorPredicate.isString
                                        }
                                   }
                                      error:&error]

要求

安装

  • 将RPJSONValidator中的文件复制到您的项目中