簡體   English   中英

如果在Objective c中為isKindOfClass([NSString] class),則如何解析數據

[英]How to parse data, if it `isKindOfClass([NSString] class)` in Objective c

我被困在這里,我是iOS的新手,請幫助我。

現在,我的dict有數據,但具有不同的類格式。 如果它是NSDictionary格式,那么它將運行良好,它將解析所有數據並正確顯示。

現在,有時我的JSON返回NSDictionary,有時返回NSString。

貝婁是代碼,用於讀取JSON數據是KindOfClass: NSDictionary

@interface demoActivityDetails()

@property (strong ,nonatomic) NSArray *activityDescription;

@end

@implementation demoActivityDetails

    - (instancetype)initWithDict:(NSDictionary *)dict{
        self = [super init];

    if (self) {


     if ([dict isKindOfClass:[NSString class]]) {
                NSLog(@"String");
            //I'm stuck over here, don't know how do I parse data if it is NSString class
      }
     else if ([dict isKindOfClass:[NSDictionary class]]) {
                if ([[dict valueForKey:@"demoActivityTypeCode"] valueForKey:@"value"]) {
                    self.demoActivityTypeCode = [[dict valueForKey:@"demoActivityTypeCode"] valueForKey:@"value"];
                }


                if ([[[dict valueForKey:@"cityOfActivity"] valueForKey:@"cityCode"] valueForKey:@"value"]) {
                    self.cityOfOrigin = [[[dict valueForKey:@"cityOfActivity"] valueForKey:@"cityCode"] valueForKey:@"value"];
                }

                if ([[[dict valueForKey:@"cityOfActivity"] valueForKey:@"cityySubdivisionCode"] valueForKey:@"value"]) {
                    self.citySubdivisionCodeArray = [[[dict valueForKey:@"cityOfActivity"] valueForKey:@"citySubdivisionCode"] valueForKey:@"value"];
                }




                if ([dict valueForKey:@"activityDescription"]) {
                    self.activityDescription = [dict  valueForKey:@"activityDescription"];
                }

                if ([self.activityDescription isKindOfClass:[NSArray class]]) {

                    if ([self.activityDescription valueForKey:@"languageCode"]) {
                        self.flagsArray = [self.activityDescription valueForKey:@"languageCode"];
                    }

                    if ([self.activityDescription valueForKey:@"value"]) {
                        self.subTitleArray = [self.activityDescription valueForKey:@"value"];
                    }

                    if (self.flagsArray && self.subTitleArray) {

                        self.subTitleWithLangCode  = [[NSMutableDictionary alloc] initWithObjects:self.subTitleArray forKeys:self.flagsArray];
                    }

                    if ([self.flagsArray containsObject:@"en"]) {
                        for (int i=0 ; i < self.flagsArray.count; i++ ) {
                            if ([self.flagsArray[i] isEqualToString:@"en"]) {
                                self.subTitle = [self.subTitleArray objectAtIndex:i];
                                self.selectedFlag = [self.flagsArray objectAtIndex:i];
                            }
                        }
                    }else {
                        self.subTitle = [self.subTitleArray firstObject];
                        self.selectedFlag = [self.flagsArray firstObject];
                    }

                }
                else if ([self.activityDescription isKindOfClass:[NSString class]]) {
                    self.subTitle = (NSString *)self.activityDescription;
                }

            }

      }

        }
        return self;
    }

    @end

請有人幫我。

如果String為JSON格式,則可以將其轉換為NSData ,然后使用NSJSONSerialization將數據轉換為JSON對象(在您的情況下為NSDictionary )。 我認為您應該根據參數引入不同的初始化程序。 另外,您應該在initWithDict清理解析邏輯。 在分配給引用之前,您將獲得檢查類型的獎勵。 萬一來自后端或任何地方的數據與您的解析代碼不匹配,則可以正常解決問題,否則可能導致崩潰。 我會像這樣重寫此類:

@interface DemoActivityDetails()

@property (strong ,nonatomic) NSArray *activityDescription;
@property (strong ,nonatomic) NSString *demoActivityTypeCode;
@property (strong ,nonatomic) NSString *cityOfOrigin;
@property (strong ,nonatomic) NSArray<NSString*> *citySubdivisionCodeArray;

@end

@implementation DemoActivityDetails

- (instancetype _Nullable)initWithObject:(id _Nonnull)object {
    if(object == nil) {
        return nil;
    }
    if([object isKindOfClass:[NSDictionary class]])
        return [self initWithDict:object];
    else if([object isKindOfClass:[NSString class]])
        return [self initWithString:object];
    else
        return nil;
}

- (instancetype _Nullable)initWithString:(NSString* _Nonnull)string {
    if(![string isKindOfClass:[NSString class]]) {
        return nil;
    }
    NSData* data = [string dataUsingEncoding:NSUTF8StringEncoding];
    if(!data){
        return nil;
    }
    id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
    if(json == nil || ![json isKindOfClass:[NSDictionary class]]) {
        return nil;
    }
    return [self initWithDict:json];
}

- (instancetype _Nullable)initWithDict:(NSDictionary* _Nonnull)dict {
    if(![dict isKindOfClass:[NSDictionary class]]) {
        return nil;
    }
    self = [super init];
    if(self) {
        NSDictionary* demoActivityTypeCodeDict = [dict objectForKey:@"demoActivityTypeCode"];
        if([demoActivityTypeCodeDict isKindOfClass:[NSDictionary class]]) {
            NSString* demoActivityTypeCode = [demoActivityTypeCodeDict objectForKey:@"value"];
            if([demoActivityTypeCode isKindOfClass:[NSString class]])
                self.demoActivityTypeCode = demoActivityTypeCode;
        }

        NSDictionary* cityOfActivityDict = [dict objectForKey:@"cityOfActivity"];
        if([cityOfActivityDict isKindOfClass:[NSDictionary class]]) {
            NSDictionary* cityCodeDict = [cityOfActivityDict objectForKey:@"cityCode"];
            if([cityCodeDict isKindOfClass:[NSDictionary class]]) {
                NSString* cityOrigin = [cityCodeDict objectForKey:@"value"];
                if([cityOrigin isKindOfClass:[NSString class]])
                    self.cityOfOrigin = cityOrigin;
            }
        }

        // you can continue writing code
        // ....

    }
    return self;
}

PS:不使用駝峰式命名課程也是一種規范,而是使用大寫字母開頭課程名稱

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM