[英]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.