gpt4 book ai didi

objective-c - 如何在 objective-c 中处理用于 json 格式化的嵌入式数组

转载 作者:搜寻专家 更新时间:2023-10-30 19:47:25 24 4
gpt4 key购买 nike

我有一个名为 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

然后在每个 name(foobar)中应该有 remaster_title(对于 foo:bar 两者: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); 什么都不返回。

最佳答案

评论区太小,没法问几个问题,但我们假设一些事情。您想要将 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

关于objective-c - 如何在 objective-c 中处理用于 json 格式化的嵌入式数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39232533/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com