0

我正在尝试使用从目标 c 中的文本文件中读取的数据。我从文本文件中读取的数据是:

{"aps":{"alert":"Test 1!","sound":"beep.wav","badge":5,"Type":"Banking"},"acme1":"bar","acme2":42}|{"aps":{"alert":"Test 2!","sound":"beep.wav","badge":5,"Type":"Banking"},"acme1":"bar","acme2":42}|{"aps":{"alert":"Test 3!","sound":"beep.wav","badge":5,"Type":"Banking"},"acme1":"bar","acme2":42}|{"aps":{"alert":"Test 4!","sound":"beep.wav","badge":5,"Type":"Banking"},"acme1":"bar","acme2":42}|{"aps":{"alert":"Test 5!","sound":"beep.wav","badge":5,"Type":"Banking"},"acme1":"bar","acme2":42}

读取后,我将文件拆分为一个带有“|”分隔符的数组。然后,我想进一步将其分为 3 个不同的数组:基于“类型”键的银行业务、欺诈和投资。但是,一旦将 JSON 字符串拆分为数组,我似乎无法解析它。我的观点确实加载方法如下:

- (void)viewDidLoad {

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *fileName = [NSString stringWithFormat:@"%@/AccountNotifications.txt", documentsDirectory];
    NSString *fileContents = [[NSString alloc]  initWithContentsOfFile:fileName usedEncoding:nil error:nil];
    NSArray *fileData = [fileContents componentsSeparatedByString:@"|"];

    if (fileContents != NULL)
    {
        bankingNotifications =  [[NSMutableArray alloc] init];
        fraudNotifications =  [[NSMutableArray alloc] init];
        investmentNotifications = [[NSMutableArray alloc] init];        

        for (i = 0; i < [fileData count]; i++)
        {
            NSString *notification = fileData[i];
            NSDictionary *json = [notification JSONValue];
            NSArray *items = [json valueForKeyPath:@"aps"];

            if ([[[items objectAtIndex:i] objectForKey:@"Type"] isEqual: @"Banking"])
            {
                [bankingNotifications addObject:fileData[i]];
                NSLog(@"Added object to banking array");
            }

            if ([[[items objectAtIndex:i] objectForKey:@"Type"] isEqual: @"Fraud"])
            {
                [fraudNotifications addObject:fileData[i]];
                NSLog(@"Added object to fraud array");

            }

            if ([[[items objectAtIndex:i] objectForKey:@"Type"] isEqual: @"Investment"])
            {
                [investmentNotifications addObject:fileData[i]];
                NSLog(@"Added object to investment array");

            }
        } }

这三行有错误:

    NSString *notification = fileData[i];
    NSDictionary *json = [notification JSONValue];
    NSArray *items = [json valueForKeyPath:@"aps"];

你能帮我把 JSON 字符串解析成三个可变数组吗?我得到的错误是:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSDictionaryM objectAtIndex:]: unrecognized selector sent to instance 0x1d59db30'

4

2 回答 2

3

如果您自己创建文本文件,我建议您创建一个有效的 json 对象(因为您的数据看起来应该是 json)以保持数据整洁。与此类似:

{"aps":[{"type":"Banking","badge":5},{"Type":"Fraud","badge":12}]}

然后您可以执行以下操作(此代码未经测试,可能是您必须对其进行一些修改),但我希望您能有所了解:)

NSError*    error       = nil;
NSDictionary*    dict = nil;
//serialising the jsonobject to a dictionary
dict  = [NSJSONSerialization JSONObjectWithData:fileContents
                                              options:kNilOptions
                                                error:&error];
bankingNotifications =  [[NSMutableArray alloc] init];
fraudNotifications =  [[NSMutableArray alloc] init];
investmentNotifications = [[NSMutableArray alloc] init];

if (dict) {
    NSArray *dataArray = [dict objectForKey:@"aps"];
    NSDictionary* siteData    = nil;
    NSEnumerator* resultsEnum   = [dataArray objectEnumerator];
    while (siteData = [resultsEnum nextObject])
    {
        //
        if( [[siteData objectForKey:@"Type"] isEqualToString: @"Banking"]) {
            [bankingNotifications addObject:notification];
            NSLog(@"Added object to banking array");
        } else if ([[siteData objectForKey:@"Type"] isEqualToString: @"Fraud"])
        {
            [fraudNotifications addObject:notification];
            NSLog(@"Added object to fraud array");
        }
        else if ([[siteData objectForKey:@"Type"] isEqualToString: @"Investment"])
        {
            [investmentNotifications addObject:notification];
            NSLog(@"Added object to investment array");
        }

    }
}
于 2013-03-01T01:24:41.400 回答
1

键“aps”的值是一个字典。

    NSDictionary *item = [json valueForKeyPath:@"aps"];

    if ([[item objectForKey:@"Type"] isEqualToString: @"Banking"])
    {
        [bankingNotifications addObject:notification];
        NSLog(@"Added object to banking array");
    } 
    else if ([[item objectForKey:@"Type"] isEqualToString: @"Fraud"])
    {
        [fraudNotifications addObject:notification];
        NSLog(@"Added object to fraud array");
    }
    else if ([[item objectForKey:@"Type"] isEqualToString: @"Investment"])
    {
        [investmentNotifications addObject:notification];
        NSLog(@"Added object to investment array");
    }
于 2013-02-28T22:44:25.950 回答