8

在使用Mantle时,是否有可能在返回我们正在创建的对象(在本例中通过 JSON)之前验证 X 和 Y 属性不为零?

想象一下这个类:

@interface Person : MTLModel <MTLJSONSerializing>

@property(nonatomic,strong,readonly)NSString *name;
@property(nonatomic,strong,readonly)NSString *age;

@end

我想要一种方法来验证如果我收到的 JSON 没有name(由于某种原因在服务器的数据库上存在问题)我将返回一个nilPerson,因为在没有该属性集的情况下创建该对象是没有意义的.

4

5 回答 5

3

虽然您可以覆盖初始化程序。在返回反序列化对象validate:之前的最后阶段调用 this似乎更简洁。Mantle将所有验证逻辑放在一个方法中是有意义的validate......

见最后一行MTLJSONAdapter

id model = [self.modelClass modelWithDictionary:dictionaryValue error:error];
return [model validate:error] ? model : nil;

这告诉我们,如果我们的自定义模型NO从中返回validate,那么 Mantle 将丢弃该对象。

因此,您可以在您的子类中简单地执行以下操作:

- (BOOL)validate:(NSError **)error {
    return [super validate:error] && self.name.length > 0; 
}

理想情况下,在您自己的实现中,您可能希望返回适当的错误。

然后,validate 方法将为validateValue:forKey:error:您在 Mantle 中注册的每个属性调用 Foundation JSONKeyPathsByPropertyKey。因此,如果您想要一个更受控制的验证设置,您也可以在此处验证您的数据..

于 2015-06-17T14:55:51.083 回答
1

您可以使用MTLJSONSerializing协议方法classForParsingJSONDictionary:返回 nil 而不是无效对象:

// In your MTLModelSubclass.m
//
+ (Class)classForParsingJSONDictionary:(NSDictionary *)JSONDictionary {
    if (JSONDictionary[@"name"] == nil || JSONDictionary[@"age"] == nil) {
        return nil;
    }
    return self.class;
}
于 2014-04-25T14:17:19.497 回答
0

事实上,我不使用 Mantle,但为了验证,我使用了另一个 GitHub 库,名为RPJSONValidator

它告诉您您期望的类型以及该值已到达的类型。

一个简单的示例代码

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 中。

于 2014-04-25T11:19:34.200 回答
0

我使用非常旧版本的 Mantle。YMMV

您可以覆盖[MTLModel modelWithExternalRepresentation]选择器。确保调用[super modelWithExternalRepresentation]然后添加您自己的代码来检查验证数据。

于 2014-04-25T13:13:34.690 回答
0

我关注了Mantle 上的一个小问题:

- (instancetype)initWithDictionary:(NSDictionary *)dictionaryValue error:(NSError *__autoreleasing *)error
{
    BOOL isValid = NO;
    if (self = [super initWithDictionary:dictionaryValue error:error])
    {
        isValid = ...
    }

    return isValid?self:nil;
}

所以最后只是覆盖:

- (instancetype)initWithDictionary:(NSDictionary *)dictionaryValue error:(NSError *__autoreleasing *)error
于 2014-04-25T14:16:26.517 回答