1

強く型付けされたオブジェクトに配置したい配列があります。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
   }
]

Objective-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
4

1 に答える 1

2

あなたが投稿したコードにはかなりの間違いがあります。それらを実行して正しく実行する方法を示しますが、NSArray、NSDictionary、およびNSStringのドキュメントを調べて、これらのクラスで使用できるメソッドに慣れることを強くお勧めします。実際にはできません。それらのクラスをよく知らなくても、まともなコードを書き始めます。

1)文字列エンコーディングとif(receivedData)の後のコードで何をしようとしているのかよくわかりません。JSONを文字列に変換する必要はありません。JSONObjectWithData:メソッドはデータを配列(より正確には辞書の配列)に変換します。これを操作する必要があります。

2)for-inループでは、アイテムは配列ではなくNSDictionaryとして入力する必要があります。配列内の各項目は、投稿したJSONの{}間の辞書全体です。

3)for-inループにあるすべてのコードが間違っています-それで何をしようとしているのかわかりません。ディクショナリ内のさまざまなキーの値を取得し、Settingのインスタンスをinitに割り当て、その拡張されたinitメソッドに値を渡す必要があります。

4)設定オブジェクトはJSONデータの辞書の1つの値を保持するだけなので、応答の辞書ごとに1つの設定オブジェクトを保持する別の配列を作成する必要があります(以下の例ではsettingsArrayと呼びます)。

5)Settingクラスのinitメソッドは、.hと.mで異なります。各コロンの後の名前の部分を大文字ではなく小文字にする必要があることを除いて、どちらも.mバージョンのように見える必要があります。

だから、これが私がうまくいくと思うコードです。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];
        }

    }
}

設定の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;

}

編集後:別のプロパティの値に基づいて設定のプロパティの1つの値を検索する場合は、次のように実行できます。

    for (Setting *aSetting in _settingsArray) {
        if ([aSetting.category isEqualToString:@"Frozen"]) {
            NSLog(@"%@",aSetting.facings);
        }
    }
于 2012-10-03T19:25:51.100 に答える