我正在尝试使用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;
}
提前谢谢
答案 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;
}