2017-10-06 3 views
1

私はここで立ち往生しています。私はiOSを新しくしています。Objective cの `isKindOfClass([NSString] class)`のデータを解析する方法

今私はdictのデータを持っていますが、クラス形式は異なります。それがNSDictionaryフォーマットであればそれはうまく動作し、すべてのデータを解析します&正しく表示します。

今度はJSONがNSDictionaryを返しますが、&は時々NSStringを返します。 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 

誰かが私を助けてください:

ベローは、JSONデータを読み込むことがKindOfClassで、コードです。

+3

からクラス名を開始あなたがNSStringでデータを受け取ったとき、これは@ "{\" demoActivityTypeCode \ ":{value" \:1}、\ "cityOfActivity \":{\ "cityCode:201 \"} \ "ContractTemplateID \":{\ "Content \":65、\ "type \":\ "text \"}} " –

+0

いいえ、json形式と似ています。 – aadityaa

+0

{ activityDescription = { languageCode = en; 値= "アクティビティDescription_en"; }; cityOfActivity = { cityCode = { 値= 012; }; citySubdivisionCode = { value = "CA"; }; }; demoActivityTypeCode = { value = "SampleText"; }; } – aadityaa

答えて

2

文字列JSON形式である場合、あなたはNSDataに変換してからJSONオブジェクト(あなたのケースではNSDictionary、)にデータを変換するためにNSJSONSerializationを使用することができます。私は引数に応じて異なる初期化子を導入すべきだと思います。また、解析ロジックを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:それはまた、クラスの命名にキャメルケースを使用しないための規範ではなく、資本

+0

お試しいただきありがとうございます。 – aadityaa

関連する問題