2016-06-15 3 views
2

Я пытаюсь получить некоторые данные из вызова API и сопоставить эти объекты с объектом модели. В моем случае у меня есть объект внутри объекта. Это работает и получает JSON. И это отображение отлично с самым первым объектом. В моем JSON у меня есть массив и еще один массив внутри него. Поэтому я сделал следующее, чтобы сделать это.Как сопоставить объект данных JSON внутри объекта?

отображение объекта

+(NSArray *)fromJSON:(NSDictionary *)objectNotation error:(NSError *__autoreleasing *)error{ 
    NSError *localError = nil; 

    NSDictionary *parsedObject = [[NSDictionary alloc] initWithDictionary:objectNotation]; 

    if (localError != nil) { 
     *error = localError; 
     return nil; 
    } 
    NSMutableArray *posts = [[NSMutableArray alloc] init]; 

    NSArray *results = [parsedObject valueForKey:@"data"]; 
    NSLog(@"Count %lu", (unsigned long)results.count); 

    for (NSDictionary *groupDic in results) { 
     Post *post = [[Post alloc] init]; 
     post.postBody = [NSMutableArray array]; 

     for (NSString *key in groupDic) { 
      if ([post respondsToSelector:NSSelectorFromString(key)]) { 
       [post setValue:[groupDic valueForKey:key] forKey:key]; 
      } 
     } 
     [posts addObject:post]; 
    } 
    return posts; 
} 

Это один делает несколько метаданных, чем я ожидал из-за цикл.

Модель классы

@interface OCPost : NSObject 
@property(nonatomic) NSInteger postId; 
@property(nonatomic) NSInteger userId; 
@property(nonatomic) NSInteger points; 
@property(strong, nonatomic) NSMutableArray *body; 
@end 

Я хочу, чтобы отобразить body массив с массивом Body объектов. В моем классе тела

@interface Body : NSObject 
@property (strong, nonatomic) NSString *value; 
@property (strong, nonatomic) NSString *name; 
@property (strong, nonatomic) NSMutableArray *metaData; 
@end 

А также metadata должна быть карта со следующим объектом.

@interface MetaData : NSObject 
@property (strong, nonatomic) NSString *title; 
@property (strong, nonatomic) NSString *metaDataDescription; 
@end 

Как я могу создать объект, как,

Post 
    |_Body1 
    | |_MetaData1 
    | |_MetaData2 
    | |_MetaData3 
    |_Body3 
    | |_MetaData1 
    | |_MetaData2 

Пожалуйста, помогите.

JSON

{ 
    "message": "Post ", 
    "data": [ 
     { 
     "postId": 1, 
     "timestamp": "2016-06-14 22:37:02", 
     "body": [ 
      { 
      "textId": 1, 
      "type": "link", 
      "deleting": false, 
      "metaData": [ 
      { 
      "metadataId": 1, 
      "type": "text", 
      "value": "under " 
      } 
      ] 
     }, 
     { 
      "textId": 2, 
      "type": "department", 
      "deleting": false, 
      "metaData": [ 
       { 
       "metadataId": 2, 
       "type": "text", 
       "value": "under " 
       } 
      ] 
     } 
     ] 
    } 
    ] 
} 
+0

Вы проверили [мантию] (https://github.com/Mantle/Mantle)? – Bartu

+0

есть. Я пытался. Но не решила мою проблему. Затем я переключился на этот. – codebot

+0

Вы также проверили [это] (http://stackoverflow.com/questions/13883693/how-to-specify-child-objects-type-in-an-nsarray-with-mantle) особенность? – Bartu

ответ

1

Хорошо, вы можете разобрать JSON и сопоставить его с вашими моделями данных вручную.
Вот как вы можете это сделать:

+(NSArray *)fromJSON:(NSDictionary *)objectNotation error:(NSError *__autoreleasing *)error{ 
    NSError *localError = nil; 

    NSDictionary *parsedObject = [[NSDictionary alloc] initWithDictionary: objectNotation]; 

    if (localError != nil) { 
     *error = localError; 
     return nil; 
    } 
    NSMutableArray *posts = [[NSMutableArray alloc] init]; 

    NSArray *results = [parsedObject valueForKey:@"data"]; 
    NSLog(@"Count %lu", (unsigned long)results.count); 

    for (NSDictionary *groupDic in results) { 
     OCPost *post = [[OCPost alloc] init]; 
     post.body = [NSMutableArray array]; 

     //1. Parse bodies 
     NSArray *bodies = groupDic[@"body"]; 

     for (NSDictionary *aBody in bodies) { 
      Body *body = [[Body alloc] init]; 
      body.value = aBody[@"textId"]; 
      body.name  = aBody[@"type"]; 
      body.metaData = [@[] mutableCopy]; 

      //2. Parse metadatas 
      NSArray *metadatasOfBody = aBody[@"metaData"]; 

      for (NSDictionary *aMetadata in metadatasOfBody) { 
       MetaData *metadata   = [[MetaData alloc] init]; 
       metadata.title    = aMetadata[@"type"]; 
       metadata.metaDataDescription = aMetadata[@"value"]; 

       //3. Add metadata to body 
       [body.metaData addObject:metadata]; 
      } 

      //4. Add body to post 
      [post.body addObject: body]; 
     } 

     //Logs to check post body and body metadata 
     NSLog(@"post %@", post); 
     NSLog(@"post body %@", post.body); 

     for (Body *body in post.body) { 
      NSLog(@"post body metadata %@", body.metaData); 
     } 

     //5. Add post to posts 
     [posts addObject: post]; 
    } 

    //Log to check return posts 
    NSLog(@"posts %@", posts); 

    return posts; 
} 

Чтобы проверить это можно представить вашу JSON как NSDictionary, как это:

- (NSDictionary*) aJSON 
{ 
    return @{ 
     @"message": @"Post ", 
     @"data": @[ 
       @{ 
       @"postId": @1, 
       @"timestamp": @"2016-06-14 22:37:02", 
       @"body": @[ 
          @{ 
          @"textId": @1, 
          @"type": @"link", 
          @"deleting": @false, 
          @"metaData": @[ 
             @{ 
             @"metadataId": @1, 
             @"type": @"text", 
             @"value": @"under " 
             } 
             ] 
          }, 
          @{ 
          @"textId": @2, 
          @"type": @"department", 
          @"deleting": @false, 
          @"metaData": @[ 
             @{ 
             @"metadataId": @2, 
             @"type": @"text", 
             @"value": @"under " 
             } 
             ] 
          } 
          ] 
       } 
       ] 
     }; 
} 

Заменить objectNotation с [self aJSON], чтобы иметь возможность отображения тест без вызова сервер API или, конечно же, конечную точку API сервера вызовов, и попробуйте протестировать с ответом JSON.

Смежные вопросы