繁体   English   中英

创建NSDictionary无效的Objective-C foreach

[英]Objective-C foreach for creating a NSDictionary not working

我正在尝试使用以下代码对NSDictionary进行排序:

NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:[str dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingMutableLeaves error:&err];
for (NSDictionary* lesson in jsonDict[@"data"][@"lessons"]) {
    data[lesson[@"day"]][lesson[@"index"]][@"title"] = lesson[@"title"];
}

如果我记录了lesson[@"day"]的值,依此类推,那么这些值似乎是正确的。 如果以某种方式在循环后记录data[@"1"][@"1"] ,它只是空的。 因此,问题似乎在于将值设置为NSDictionary数据。

原始JSON字符串包含一个包含所有课程的列表。 为了正确访问它们,我想使用以下格式的新NSDictionary:data [day] [index] [field]

JSON代码如下所示:

{"status":"success","data":{"lessons":[{"id":1,"index":"1","day":"1","title":"Mathe","teacher":"Mr. xyz","room":"103","ind":"1"},{"id":2,"index":"1","day":"2","title":"Physik","teacher":"Mr xyz","room":"PH4","ind":"1"},...

问题是(我认为)

data[lesson[@"day"]][lesson[@"index"]][@"title"] = lesson[@"title"];

不会自动创建中间词典

data[lesson[@"day"]]
data[lesson[@"day"]][lesson[@"index"]]

您必须首先检查它们是否存在,如果它们不存在,则分配一个可变字典。 (没有像Perl哈希那样的自动生存 !)类似:

if (data[lesson[@"day"]] == nil) {
    data[lesson[@"day"]] = [NSMutableDictionary dictionary];
}
if (data[lesson[@"day"]][lesson[@"index"]] == nil) {
    data[lesson[@"day"]][lesson[@"index"]] = [NSMutableDictionary dictionary];
}
data[lesson[@"day"]][lesson[@"index"]][@"title"] = lesson[@"title"];

完整的工作代码:

NSString *str = @"{\"status\":\"success\",\"data\":{\"lessons\":[{\"id\":1,\"index\":\"1\",\"day\":\"1\",\"title\":\"Mathe\",\"teacher\":\"Mr. xyz\",\"room\":\"103\",\"ind\":\"1\"},{\"id\":2,\"index\":\"1\",\"day\":\"2\",\"title\":\"Physik\",\"teacher\":\"Mr xyz\",\"room\":\"PH4\",\"ind\":\"1\"}]}}";
NSError *err;
NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:[str dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingMutableLeaves error:&err];
NSMutableDictionary *data = [NSMutableDictionary dictionary];

for (NSDictionary* lesson in jsonDict[@"data"][@"lessons"]) {
    if (data[lesson[@"day"]] == nil) {
        data[lesson[@"day"]] = [NSMutableDictionary dictionary];
    }
    if (data[lesson[@"day"]][lesson[@"index"]] == nil) {
        data[lesson[@"day"]][lesson[@"index"]] = [NSMutableDictionary dictionary];
    }
    data[lesson[@"day"]][lesson[@"index"]][@"title"] = lesson[@"title"];
}
NSLog(@"%@", data);

输出:

{
    1 =     {
        1 =         {
            title = Mathe;
        };
    };
    2 =     {
        1 =         {
            title = Physik;
        };
    };
}

NSJSONSerialization创建字典和数组,并填充其他字典,数组和NSString,NSNumber或NSNull类型的值。

您应该重新考虑编写非常复杂的代码行的策略,但要一一提取,以减少混乱,并使调试成为可能。 喜欢

NSDictionary* data = jsonDict [@"data"];
NSArray* lessons = data [@"lessons"];

for (NSDictionary* lesson in lessons)
{
    NSString* lessonDay = lesson [@"day"];
    ...
}

等等(如果您不一次又一次又一次地查找相同的内容,这也将使您的代码运行更快)。

现在到您的错误所在的位置:dict [@“ key”] =数据; 调用setObject:forKey:。 但是,字典[@“ key1”] [@“ key2”]会在字典上调用objectForKey:@“ key1”,这将为您提供nil值,然后将使用nil接收器调用setObjectForKey:。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM