NSDictionary 展平层次结构
Posted
技术标签:
【中文标题】NSDictionary 展平层次结构【英文标题】:NSDictionary flatten hierarchy 【发布时间】:2012-12-08 17:24:01 【问题描述】:我有一个像这样的 NSDictionary 对象:
dictionary:
data =
"access_token" = "xxx";
"expires_in" = 00;
"refresh_token" = "yyy";
"token_type" = bearer;
;
如何将其展平以便删除“数据”对象?有没有快速的方法来做到这一点? 所以输出应该是这样的:
dictionary:
"access_token" = "xxx";
"expires_in" = 00;
"refresh_token" = "yyy";
"token_type" = bearer;
;
【问题讨论】:
顺便希望访问令牌数据无效。 你的字典和数据键是什么? 你的字典格式不对NSDictionary *result = [dictionary objectForKey:@"data"];
【参考方案1】:
NSDictionary *dataDict = [mainDict objectForKey:@"data"];
【讨论】:
Doesnt work.... 我得到 *** Terminating app due to unaught exception 'NSInvalidArgumentException', reason: '*** -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: 尝试插入 nil object from objects[0]' *** 首先抛出调用堆栈: 这不会产生平面字典 @Imme22009 那么你并没有准确地给出你的字典有什么 正如我所说,这不会把它弄平。这将导致一个带有键字典的字典,其值为 dataDict @Daij-Djan 现在还好吗.. 你不认为他有错误的 dict 对象吗.. 在字典中你有key : value
而不是 key = value
【参考方案2】:
您的示例中的平面字典:
//grab data
NSDictionary *data = [yourDict objectForKey:@"data"];
assert(data != nil);
NSDictionary *flatDict = data; //OR data.copy // OR [NSDictionary dictionaryWithDictionary:data];
【讨论】:
@InderKumarRathore 是的,我知道。我不确定他是否想要一份副本或其他什么:D 我编辑了我的答案【参考方案3】:它看起来不像“数据”是一个 NSDictionary。试试
id what = [dict objectForKey : @"data"];
NSLog(@"%@", [what class]);
它说了什么?
【讨论】:
【参考方案4】:使用递归函数,这种方法唯一的问题是如果嵌套字典中的key恰好相同,它将替换旧数据
- (NSDictionary *)flattedDictionary
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
for (NSString *key in self.allKeys)
id object = [self objectForKey:key];
if (![object isKindOfClass:[NSDictionary class]] && !isNull(object))
[dict setObject:object
forKey:key];
else if ([object isKindOfClass:[NSDictionary class]])
[dict addEntriesFromDictionary:[object flattedDictionary]];
return [NSDictionary dictionaryWithDictionary:dict];
【讨论】:
以上是关于NSDictionary 展平层次结构的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Hive/Pig/MapReduce 展平递归层次结构