Как проанализировать специфичные для json поля, используя target-c - PullRequest
1 голос
/ 20 февраля 2011

Я пытаюсь проанализировать очень простой объект json с 1 значением. (тест ocUnit ниже)

- (void) testHatCartParseWithValidRefId {
  NSString* data = @"{\"refid\":999}";
  Cart* obj = [HatCartParseJson parseJsonAndReturnObject:data];

  STAssertTrue([obj.refid isEqualToString:@"999"], @"fail");
}

В реализации все терпит неудачу, когда я добавляю строку, чтобы извлечь ее из ключа или индекса. Как я должен извлечь это из ввода JSON? Пожалуйста, имейте в виду, что мне нужен этот json-анализ (не строка), фактический код, с которым я работаю, представляет собой большой набор данных JSON.

+ (Cart *) parseJsonAndReturnObject:(NSString *)json
{ 
  NSArray* cart = [json JSONValue];
  for (NSDictionary* item in cart) {
    Cart* obj = [[Cart alloc] init];
    //NSString* refid = [item objectAtIndex:0];
    //NSString* refid = [item objectForKey:@"refid"];
    [obj setRefid:@"999"];

    return obj;
  }

  return nil;
}

Заранее спасибо

1 Ответ

1 голос
/ 20 февраля 2011

Вы ожидаете, что возвращаемое значение JSONValue является NSArray, что в данном случае не так.

Итак, вы должны проверить, действительно ли возвращаемое значение NSArray, и если это так, то итерация по коллекции, в противном случае проверьте, является ли она NSDictionary, а если это так, то верните объект Cart с refid из NSDictionary.Если все это не сработало, просто верните nil.

. В качестве дополнительной точки, согласно Политике владения объектами , вы должны вернуть autorelease -d объекты из методов, имена которыхне содержат слова «alloc», «new» или «copy».Это был бы один из таких методов, где вы должны вернуть autorelease -d объект.

+ (Cart *) parseJsonAndReturnObject:(NSString *)json
{ 
  id cart = [json JSONValue];
  NSString* refid = nil;
  if([cart isKindOfClass:[NSArray class]]) {
    refid = [[cart objectAtIndex:0] objectForKey:@"refid"];
  } else if([cart isKindOfClass:[NSDictionary class]]) {
    refid = [cart objectForKey:@"refid"];
  }

  if(refid) {
    Cart* c = [[Cart alloc] init];
    [c setRefid:refid];
    return [c autorelease];
  } 
  return nil;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...