从json数组创建一个强类型对象

时间:2012-09-28 00:15:06

标签: objective-c ios json

我有一个我填充的数组,我反过来想把它放在一个强类型的对象中。我有这个代码已经填充了json数据,我想用这些数据填充我的Setting对象。我怎么能这样做?

JSON回复:

得到回复:

[
   {
      "CatalogID":2377,
      "Category":"Frozen",
      "Facings":true,
      "ID":13,
      "LastUpdateDateTime":"\/Date(1348681365520-0700)\/",
      "Quantity":true
   },
   {
      "CatalogID":2377,
      "Category":"Fruit",
      "Facings":true,
      "ID":10,
      "LastUpdateDateTime":"\/Date(1348692069843-0700)\/",
      "Quantity":false
   },
   {
      "CatalogID":2377,
      "Category":"Salads",
      "Facings":true,
      "ID":12,
      "LastUpdateDateTime":"\/Date(1348681354807-0700)\/",
      "Quantity":true
   },
   {
      "CatalogID":2377,
      "Category":"Vegetables",
      "Facings":true,
      "ID":11,
      "LastUpdateDateTime":"\/Date(1348681334523-0700)\/",
      "Quantity":true
   }
]

目标-C

-(void) connectionDidFinishLoading:(NSURLConnection *)connection {

NSError *error = nil;
// Get the JSON data from the website

id result = [NSJSONSerialization JSONObjectWithData:receivedData options:kNilOptions error:&error];

NSStringEncoding responseEncoding = NSUTF8StringEncoding;
if ([response textEncodingName]) {
    CFStringEncoding cfStringEncoding = CFStringConvertIANACharSetNameToEncoding((__bridge CFStringRef)[response textEncodingName]);
    if (cfStringEncoding != kCFStringEncodingInvalidId) {
        responseEncoding = CFStringConvertEncodingToNSStringEncoding(cfStringEncoding);
    }
}

if(receivedData)
{
    NSString *dataString = [[NSString alloc] initWithData:receivedData encoding:responseEncoding];

    NSLog(@"Got response as %@", dataString);

}

if ([result isKindOfClass:[NSArray class]]) {

    for (NSArray *item in result) {
        NSArray *items = [item valueForKey:@"ID"];

        [_settings addObject:items];

        // Try to populate Setting object
        Setting *setting = (Setting *)[_settings objectAtIndex:0];

        NSLog(@"Setting: %@", setting);
    }
}
else {
    NSDictionary *jsonDictionary = (NSDictionary *)result;

    for(NSDictionary *item in jsonDictionary)
        NSLog(@"Item: %@", item);
}

NSLog(@"Finished");
}

Setting.h

@interface Setting : NSObject {

NSString *_settingsID;
NSString *_catalogID;
NSString *_category;
NSString *_facings;
NSString *_quantity;
}

@property (nonatomic, retain) NSString *settingsID;
@property (nonatomic, retain) NSString *catalogID;
@property (nonatomic, retain) NSString *category;
@property (nonatomic, retain) NSString *facings;
@property (nonatomic, retain) NSString *quanity;

- (Setting *)initWithName:(NSString *)settingsID desc:(NSString *)category;

@end

Setting.m

@implementation Setting

@synthesize settingsID = _settingsID;
@synthesize catalogID = _catalogID;
@synthesize category = _category;
@synthesize facings = _facings;
@synthesize quanity = _quantity;

- (Setting *)initWithName:(NSString *)settingsID desc:(NSString *)category CategoryID:(NSString *)catalogID Facings:(NSString *)facings Quantity:(NSString *)quantity {

if ((self = [super init])) {

    self.settingsID = settingsID;
    self.catalogID = catalogID;
    self.category = category;
    self.facings = facings;
    self.quanity = quantity;
}

return self;

}

@end

1 个答案:

答案 0 :(得分:2)

您发布的代码中存在很多错误。我将通过它们向您展示如何正确地完成它,但我强烈建议您学习NSArray,NSDictionary和NSString的文档,以熟悉这些课程中可用的方法 - 您真的可以&#39甚至在不了解这些类的情况下开始编写不错的代码。

1)我真的不知道你在尝试使用字符串编码和if(receivedData)之后的代码。没有必要将您的JSON转换为字符串,JSONObjectWithData:方法将您的数据转换为数组(更准确地说,是一组字典),这就是您需要使用的内容。

2)在你的for-in循环中,item应该被输入为NSDictionary,而不是数组。数组中的每个项目都是您发布的JSON中{}之间的完整字典。

3)你在for-in循环中拥有的所有代码都是错误的 - 我无法告诉你他们正在尝试用它做什么。您需要做的是获取字典中各种键的值,为init设置一个实例,并在该扩展的init方法中传递值。

4)您的设置对象只保留JSON数据中其中一个字典的值,因此您需要创建另一个数组来为响应中的每个字典保存一个设置对象(我在下面的示例中称之为settingsArray)

5)你在.h和.m中设置类的init方法是不同的,它们都应该看起来像.m版本,除了每个冒号之后的名称片段应该是小写的,不是大写的。< / p>

所以,这是我认为可行的代码。由于我无法访问您的JSON,因此我无法对其进行测试,因此请尝试一下,然后再回复我的结果。

因此,在您下载的类中,您应该在connectionDidFinishLoading方法中拥有属性,settingsArray和以下代码:

-(void) connectionDidFinishLoading:(NSURLConnection *)connection {
    self.settingsArray = [NSMutableArray array];
    NSError *error = nil;
    id result = [NSJSONSerialization JSONObjectWithData:receivedData options:kNilOptions error:&error];
    if ([result isKindOfClass:[NSArray class]]) {

        for (NSDictionary *item in result) {
            NSString *settingsID = [item objectForKey:@"ID"];
            NSString *category = [item objectForKey:@"Category"];
            NSString *categoryID = [item objectForKey:@"CatalogID"];
            NSString *facings = [item objectForKey:@"Facings"];
            NSString *quantity = [item objectForKey:@"Quantity"];

            Setting *setting = [[Setting alloc] initWithName:settingsID desc:category categoryID:categoryID facings:facings quantity:quantity];
            [self.settingsArray addObject:setting];
        }

    }
}

Setting中的init方法应如下所示:

- (Setting *)initWithName:(NSString *)settingsID desc:(NSString *)category categoryID:(NSString *)catalogID facings:(NSString *)facings quantity:(NSString *)quantity {

    if ((self = [super init])) {

        self.settingsID = settingsID;
        self.catalogID = catalogID;
        self.category = category;
        self.facings = facings;
        self.quanity = quantity;
    }

    return self;

}

编辑后:如果要根据另一个属性的值查找某个设置属性的值,可以这样做:

    for (Setting *aSetting in _settingsArray) {
        if ([aSetting.category isEqualToString:@"Frozen"]) {
            NSLog(@"%@",aSetting.facings);
        }
    }
相关问题