2014-04-15 144 views
0

我试图解析此JSON:JSON解析为一个对象

{ 
    "GetMachineGroupsResult": { 
     "MachineGroups": [ 
      { 
       "GroupCount": 1, 
       "GroupID": 101, 
       "GroupName": "Machine11" 
      }, 
      { 
       "GroupCount": 6, 
       "GroupID": 201, 
       "GroupName": "Machine12" 
      }, 
      { 
       "GroupCount": 1, 
       "GroupID": 301, 
       "GroupName": "Machine13" 
      }, 
      { 
       "GroupCount": 1, 
       "GroupID": 501, 
       "GroupName": "Machine14" 
      }, 
      { 
       "GroupCount": 7, 
       "GroupID": 701, 
       "GroupName": "Machine15" 
      }, 
      { 
       "GroupCount": 1, 
       "GroupID": 901, 
       "GroupName": "Machine16" 
      }, 
      { 
       "GroupCount": 1, 
       "GroupID": 1001, 
       "GroupName": "Machine17" 
      } 
     ], 
     "Status": 0 
    } 
} 

向具备的属性GroupCount,组ID和组名创建的对象。

这里是我的代码:

if (request.responseStatusCode >= 200 && request.responseStatusCode < 300) 
{ 
    NSData *responseData = [request responseData]; 
    NSError* error; 
    NSDictionary* jsonOverview = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error]; 
    NSString *resultStatusString = jsonOverview[@"GetMachineOverviewResult"][@"Status"]; 
    int resultStatus = [resultStatusString intValue]; 
    NSDictionary *parsedObject = jsonOverview[@"GetMachineGroupsResult"]; 

    NSMutableArray *groups = [[NSMutableArray alloc] init]; 
    NSArray *results = [parsedObject valueForKey:@"MachineGroups"]; 
    NSLog(@"Count %lu", (unsigned long)results.count); //results.count = 7 

    for (NSDictionary *parseDic in results) { 
     MachineGroupList *machinegrouplist = [[MachineGroupList alloc] init]; 
     NSLog(@"%@", [parseDic class]); 
     NSLog(@"%@", parseDic); 
     for (NSString *key in parseDic) { 
      if ([machinegrouplist respondsToSelector:NSSelectorFromString(key)]) { 
       [machinegrouplist setValue:[parseDic valueForKey:key] forKey:key]; 
     } 

     [groups addObject:machinegrouplist]; 
    } 
    } 
    NSLog (@"GroupObjects %lu", (unsigned long)[groups count]); //groups count = 21 

出于某种原因,我无法捉摸,它分析每个项目三次,我结束了21个对象,而不是7.我知道这将是一些简单的这里的专家之一,但我是新来的这一切,真的很感谢这里的帮助,谢谢。

编辑: 非常感谢,这里是它现在的样子,它的工作原理.. addobject是在错误的部分!

for (NSDictionary *parseDic in results) 
    { 
     MachineGroupList *machinegrouplist = [[MachineGroupList alloc] init]; 
     NSLog(@"%@", [parseDic class]); 
     NSLog(@"%@", parseDic); 
     for (NSString *key in parseDic) 
      { 
      if ([machinegrouplist respondsToSelector:NSSelectorFromString(key)]) 
       { 
        [machinegrouplist setValue:[parseDic valueForKey:key] forKey:key]; 
       } 
       //[groups addObject:machinegrouplist]; 
      } 
     [groups addObject:machinegrouplist]; 
    } 
    NSLog (@"GroupObjects %lu", (unsigned long)[groups count]); //groups count = 7 
+0

将一个有用的'description'方法添加到'MachineGroupList'类中,然后记录'groups'数组,以便查看所有21个对象。这是否会给你任何有用的想法? – rmaddy

+0

我已经登录了21个项目,它似乎是每个项目的三倍。每个对象都有三个属性..我收到了线索,但它不是为我点击! – user3524211

+0

我也没有看到它。您只需在'result'中为每个值调用'addObject:'一次。您公布的代码是否是您的REAL ACTUAL代码? – rmaddy

回答

1

发生了以下事情。首先,让我们注释掉一些代码的最后行,使它看起来像这样:

for (NSDictionary *parseDic in results) { 
    //MachineGroupList *machinegrouplist = [[MachineGroupList alloc] init]; 
    NSLog(@"%@", [parseDic class]); 
    //NSLog(@"%@", parseDic); 
    //for (NSString *key in parseDic) { 
    // if ([machinegrouplist respondsToSelector:NSSelectorFromString(key)]) { 
    //  [machinegrouplist setValue:[parseDic valueForKey:key] forKey:key]; 
    // } 

    // [groups addObject:machinegrouplist]; 
    //} 
} 
//NSLog (@"GroupObjects %lu", (unsigned long)[groups count]); //groups count = 21 

你会本身,你遍历词典,各自有对象。

现在,注释掉以前的NSLog,取消注释内循环,并在该循环内添加一个NSLog,以查看您正在迭代的内容。

for (NSDictionary *parseDic in results) { 
    //MachineGroupList *machinegrouplist = [[MachineGroupList alloc] init]; 
    //NSLog(@"%@", [parseDic class]); 
    //NSLog(@"%@", parseDic); 
     for (NSString *key in parseDic) { 
    // if ([machinegrouplist respondsToSelector:NSSelectorFromString(key)]) { 
    //  [machinegrouplist setValue:[parseDic valueForKey:key] forKey:key]; 
    // } 

    // [groups addObject:machinegrouplist]; 
     NSLog(@"key: %@", key); 
    } 
} 
//NSLog (@"GroupObjects %lu", (unsigned long)[groups count]); //groups count = 21 

你迭代的每个 7个字典的3个对象,并因为你正在添加的每个对象if ([machinegrouplist respondsToSelector:NSSelectorFromString(key)])之外,你最终将到

干杯。

+0

谢谢。这是有道理的,我现在已经清理了缩进以使其更清晰。我仍然不确定如何解决这个问题,我应该如何正确地迭代以获得每个具有正确3个属性的7个对象?出于某种原因,我无法把头转向它! – user3524211

+0

我刚发布该评论时,它打我!非常感谢! – user3524211