如何使用objective-c解析json特定字段

时间:2011-02-19 23:19:59

标签: objective-c json

我正在尝试使用1个值解析一个非常简单的json对象。 (下面的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 个答案:

答案 0 :(得分:1)

您希望JSONValue的返回值为NSArray,在这种情况下不是。{/ p>

因此,您必须检查返回值是否实际为NSArray,如果是,则迭代整个集合,否则检查它是否为NSDictionary,如果是,然后使用Cart中的refid返回NSDictionary个对象。如果所有这些都失败了,那么只需返回nil

作为一个侧面点,根据Apple的Object Ownership Policy,您应该从名称中不包含“alloc”,“new”或“copy”的方法返回autorelease - d个对象。这将是一种这样的方法,您将返回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;
}