【问题标题】:How to deal with embedded arrays for json formatting in objective-c如何在objective-c中处理json格式的嵌入式数组
【发布时间】:2016-08-30 16:19:21
【问题描述】:

我有一本名为array的字典:

     {
        "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); 什么也没返回。

【问题讨论】:

  • 我不明白你为什么想要所有嵌套的字典,为什么不只使用{name:{remastered_title1:{"encoding":...,"format":...,"media":...}, remasted_title2:{...}}, name2:...} 之类的东西?
  • 正如 Tadhg 所说,您是否有理由在多嵌套字典中需要它?数据是否可以以嵌套格式传递到您的应用程序,如果可以,您可能会使用 Mantle,如果您正在寻找,我可以提供一个示例。
  • 我只是希望能够遍历每个数组中的每个数组 :) 我对结构很困惑!

标签: objective-c arrays json


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    • 2017-06-09
    • 2014-08-21
    相关资源
    最近更新 更多