iOS saving and reading JSON file

iOS ve OSX ortamında JSON formatlarıyla oynamak diğer dillere göre biraz daha kolay diye düşünüyorum. OSX SDK’in içinde mevcut parserlar mevcut. NSJSONSerialization sınıfı hem JSON dosyalarımızı okumayı hem de üzerinde işlem yapmamızı kolaylaştırıyor. Aşağıda çok basit bir örnek ile mantığını kavramak açısından hem JSON dosyasını veri işlemeyi hem de okumayı göstereceğim. İlk olarak basit bir örnek ile verimizi iOS cihazının Library dizinine hani OS’un sistemine yazalım.

NSMutableArray *topLevelNode = [[] mutableCopy];
NSArray *tempNames = [@"ahmet",@"mehmet",@"veli"];

for(int i = 0; i<tempNames.count; i++) {
     NSMutableDictionary *singleNode = {}.mutableCopy;
     singleNode.name = tempNames[i];
     [topLevelNode addObject:singleNode];
}

NSURL *library = [fileManager URLForDirectory:NSLibraryDirectory
                                         inDomain:NSUserDomainMask
                                appropriateForURL:nil
                                           create:NO
                                            error:nil];

NSURL *jsonFile = [library URLByAppendingPathComponent:@"names.json" isDirectory:NO];

// Eğer manuel olarak oluşturduğumuz JSON dosyası yazılmaya müsaitse yazdırma işlemini yapıyoruz

if([NSJSONSerialization isValidJSONObject:topLevelNode]) {
     NSData *json = [NSJSONSerialization dataWithJSONObject:topLevelNode
                                         options:NSJSONWritingPrettyPrinted
                                         error:nil];
     [json writeToURL:jsonFile atomically:YES];
}

Yukarıda farkettiğiniz üzere iki tane NSURL objesi kullandık. Bunun sebebi ise Apple’ın koyduğu standartlar yüzünden. Eğer iOS cihazlarda dizine ulaşmak istiyor isek yani üzerinde işlem yapmak istiyor ise NSURL sınıfı kullanmak zorundayız.

Okumayı yazmayı bitirdik. Şimdi de yazdığımızı okuyalım…

NSFileManager *read_FileManager = [NSFileManager defaultManager];
    
    NSURL *read_LibraryDocument = [read_FileManager URLForDirectory:NSLibraryDirectory
                                                 inDomain:NSUserDomainMask
                                        appropriateForURL:nil
                                                   create:NO
                                                    error:nil];
    NSURL *read_JsonFile = [read_LibraryDocument URLByAppendingPathComponent:@"names.json" isDirectory:NO];
    NSData *read_JsonData = [NSData dataWithContentsOfURL:read_JsonFile];
    
    NSArray *videoGameJSON = [NSJSONSerialization JSONObjectWithData:read_JsonData
                                                             options:NSJSONReadingMutableContainers
                                                               error:nil];
    // parse it for videoGames array
    NSMutableArray *names = @[].mutableCopy;
    
    for(NSDictionary *jsonNode in names) {
        
        CustomModel *customModel = [[CustomModel alloc] init];
        customModel.name = jsonNode[@"name"];
        [videoGameReviews addObject:customModel];
    }

Yukarıda da yazdırma ile ilgili hemen hemen aynı işlemi yaptık. Sadece ben daha sonradan veri eklenebilmesi için bir boş NSObject model oluşturup onun içine verdim “name” attributunu.

Advertisements