2016-08-30 18 views
4

JSON格式嵌入式陣列我有一個名爲array詞典:如何處理在Objective-C的

 { 
     "encoding": "320", 
     "format": "MP3", 
     "media": "CD", 
     "name": "foo", 
     "remaster_title": "" 
    }, 
    { 
     "encoding": "V0 (VBR)", 
     "format": "MP3", 
     "media": "CD", 
     "name": "bar", 
     "remaster_title": "" 
    }, 
    { 
     "encoding": "Lossless", 
     "format": "FLAC", 
     "media": "CD", 
     "name": "bar", 
     "remaster_title": "hoho" 
    } 

我想,讓自己獨特的分離這些。例如,應該只有一個name,所以會有兩個部分:foobar

然後,每個namefoobar)內,應該有一個remaster_title(對於foobar二者:hoho)....

這應該是在順序:name > remaster_title > media > format > encoding

我想,如果我能有類似的格式,這會工作:所以所有的鍵,然後將合併

music[name][remaster_title][media][format] = encoding 

我曾嘗試:

+(NSMutableDictionary*)handleReturnedArtistJson:(NSDictionary*)json{ 
    NSMutableDictionary *music = [[NSMutableDictionary alloc] init]; 
    for(NSDictionary *result in json[@"response"][@"group"]) { 
     NSString* release_type = result[@"releaseType"]; 
     NSString* name = result[@"groupName"]; 

     if (![release_type isEqual: @"Compilation"]){ 
      for (NSDictionary *subgroup in result[@"subgroup"]){ 
       NSString* media = subgroup[@"media"]; 
       NSString* remaster_title = subgroup[@"remasterTitle"]; 
       NSString* format = subgroup[@"format"]; 
       NSString* encoding = subgroup[@"encoding"]; 

       music[name][remaster_title][media][format] = encoding; 
      } 
     } 
    } 
    return music; 
} 

NSLog(@"%@",music);回報什麼。

+1

我不明白你爲什麼希望所有嵌套的字典,爲什麼不只是像'{名稱:{remastered_title1:{ 「編碼」:......」格式「:...,」media「:...},remasted_title2:{...}},name2:...}'? –

+0

正如Tadhg所說,你是否有理由在多嵌套字典中使用它?數據是否可以以嵌套格式傳遞給您的應用程序,如果可以的話,您可以使用Mantle,我可以提供一個例子,如果這就是您想要的。 – JingJingTao

+0

我只是想能夠遍歷每個數組中的每個數組:)我對結構非常困惑! – maxisme

回答

1

評論區太小,不能提出幾個問題,但讓我們假設一些事情。您想要將JSON解析爲對象樹。讓我們看看這段代碼是否有幫助。

#import <Foundation/Foundation.h> 

typedef NSMutableDictionary<NSString*, NSString*> formatDictionary; 
typedef NSMutableDictionary<NSString*, formatDictionary*> mediaDictionary; 
typedef NSMutableDictionary<NSString*, mediaDictionary*> titleDictionary; 
typedef NSMutableDictionary<NSString*, titleDictionary*> nameDictionary; 

@interface DataSource : NSObject 
- (nameDictionary*)parseJSONFile:(NSString *)jsonFile error:(NSError *__autoreleasing *)outError; 
@end 

實施

@implementation DataSource 

- (NSString *)valueOrDefaultFromDictionary:(NSDictionary *) dictionary forKey: (NSString *) key 
{ 
    NSString * value = dictionary[key]; 
    if (![value length]) { 
     return @""; 
    } 
    return value; 
} 

- (NSArray *)jsonToArray:(NSString *)jsonFile error:(NSError *__autoreleasing *)outError 
{ 
    NSString *path = [[NSBundle mainBundle] pathForResource:jsonFile ofType:@"json"]; 
    NSString *jsonString = [[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil]; 
    NSError *jsonError; 
    NSArray *jsonDataArray = [NSArray new]; 
    jsonDataArray = [NSJSONSerialization JSONObjectWithData:[jsonString dataUsingEncoding:NSUTF8StringEncoding] options:kNilOptions error:&jsonError]; 

    if (jsonDataArray == nil) { 
     if (outError) { 
      *outError = [NSError errorWithDomain:@"yourdomain" code:-42 userInfo:@{NSUnderlyingErrorKey: jsonError}]; 
     } 
     return nil; 
    } 
    return jsonDataArray; 
} 


- (nameDictionary*)parseJSONFile:(NSString *)jsonFile error:(NSError *__autoreleasing *)outError 
{ 
    NSArray * jsonDataArray = [self jsonToArray:jsonFile error:outError]; 
    if (!jsonDataArray) { 
     return nil; 
    } 
    nameDictionary* music = [nameDictionary new]; 

    [jsonDataArray enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { 
     NSString * name = [self valueOrDefaultFromDictionary:obj forKey:@"name"]; 
     NSString * title = [self valueOrDefaultFromDictionary:obj forKey:@"remaster_title"]; 
     NSString * media = [self valueOrDefaultFromDictionary:obj forKey:@"media"]; 
     NSString * format = [self valueOrDefaultFromDictionary:obj forKey:@"format"]; 
     NSString * encoding = [self valueOrDefaultFromDictionary:obj forKey:@"encoding"]; 
     music[name] = [@{title: [@{media: [@{format:encoding} mutableCopy] } mutableCopy] } mutableCopy]; 
    }]; 
    return music; 
} 
@end