OGeek|极客世界-中国程序员成长平台

标题: iphone - 使用嵌套对象检测丢失的 JSON 键 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-12 13:37
标题: iphone - 使用嵌套对象检测丢失的 JSON 键

目前我正在使用仍在开发中的 API。因此,响应中的键仍在变化。我已经成功地从 API 检索 JSON 数据并将其解析为 NSDictionary,然后使用此 NSDictionary 将值映射到自定义对象。我使用的方法如下

-(id)initWithDictionaryNSDictionary*)dictionary
{
    if(self = [super init]){
        _ID = [dictionary valueForKey:kKEY_ID];
        _name = [dictionary valueForKey:kKEY_NAME];
        _nestedObject = [[NestedObject alloc]initWithDictionary:[dictionary valueForKey:kKEY_NESTED_OBJECT]];
        //etc...
    }
    return self
}

每个嵌套对象也包含相同的解析结构。

这工作正常,除非 API 发生变化。当某些事情发生变化时,所需的值不存在,这会导致意外行为或崩溃。

理想情况下,如果其中一个键发生更改,我想生成一个 NSError ,我可以使用它来打印已更改的值,帮助我更快地找到更改并纠正它。

我目前能想到的唯一替代方法是困惑且无法维护。

-(id)initWithDictionaryNSDictionary*)dictionary andErrorNSError**)error
{
    if(self = [super init]){

        BOOL _parsedSuccessfully = TRUE;

        if (_parsedSuccessfully) {
             _ID = [dictionary valueForKey: kKEY_ID];

             if (!_ID){
                 _parsedSuccessfully = FALSE;
                 *error = [NSError parsingErrorFromKey: kKEY_ID];
             }
        }

        if (_parsedSuccessfully) {
             _name = [dictionary valueForKey: kKEY_NAME];

             if (!_name){
                 _parsedSuccessfully = FALSE;
                 *error = [NSError parsingErrorFromKey: kKEY_NAME];
             }
        }

        if (_parsedSuccessfully) {
             _nestedObject = [[NestedObject alloc]initWithDictionary:[dictionary valueForKey:kKEY_NESTED_OBJECT]];

             if (!_nestedObject){
                 _parsedSuccessfully = FALSE;
                 *error = [NSError parsingErrorFromKey: kKEY_NESTED_OBJECT];
             }
        }

        //etc...

        if (!_parsedSuccessfully) {
            return nil;
        }
    }
    return self
}

我想知道是否还有其他人有其他更好的方法,最好使用更少的重复。

任何帮助将不胜感激。



Best Answer-推荐答案


向您的对象添加一个 isValid 方法,该方法可以在任何情况下使用,而不仅仅是从 JSON 字典初始化时。

- (BOOL)isValidNSError **)error {

    #define CHECK_NOT_NULL(x, key) if (!x) { \
        if (error != NULL) \
            *error = [NSError parsingErrorFromKey:key]; \
        return NO; \
    }

    #define CHECK_NOT_EMPTY(x, key) if (!x || ![x length]) { \
        if (error != NULL) \
            *error = [NSError parsingErrorFromKey:key]; \
        return NO; \
    }

    CHECK_NOT_NULL(_ID, kKEY_ID);
    CHECK_NOT_EMPTY(_name, kKEY_NAME);
    // etc.

    return YES;
    #undef CHECK_NOT_NULL
    #undef CHECK_NOT_EMPTY
}

然后在你的 init 方法中使用它:

- (id)initWithDictionaryNSDictionary*)dictionary andErrorNSError**)error
{
    if (self = [super init]) {
         _ID = [dictionary valueForKey: kKEY_ID];
         _name = [dictionary valueForKey: kKEY_NAME];
         // etc.

         if (![self isValid:error]) {
             self = nil;    // Assuming ARC
         }
    }
    return self;
}

关于iphone - 使用嵌套对象检测丢失的 JSON 键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18257653/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://ogeek.cn/) Powered by Discuz! X3.4