关于此问题已有很多问题,但所给出的答案都是针对特定情况的,回答了海报的个人问题,而不是问题标题。
我想知道是否有一种通用,通用,简便的方法将NSString
转换为NSDictionary
,反之亦然?
我有困难/复杂/非跨平台的方法,但肯定有一个更简单的方法吗?
以下是我所知道/经过测试的内容:
Dictionary
- > String
方法没有反转,只要您的Dictionary只是基本数据类型,数组和字典,它就能完美运行。这涵盖了大多数现实世界的案例,但Apple没有反过来:(。
[myDictionary description];
NSData
的中间方法无声地失败,因此它仅适用于一组有限的实际案例:
[myString dataUsingEncoding:NSUTF8StringEncoding];
[[NSString alloc] initWithData:myData encoding:NSUTF8StringEncoding];
//注意:在许多情况下默默地失败,返回nil string NSDictionary
- > NSData
- > NSDicitonary
运行良好 - 但他们正在使用NSData
,因此它们不是直接转换,并且它们更难以使用
[NSKeyedArchiver archivedDataWithRootObject:myDictionary];
[NSKeyedUnarchiver unarchiveObjectWithData:myData];
[NSPropertyListSerialization dataFromPropertyList:plist format:NSPropertyListXMLFormat_v1_0 errorDescription:&error];
[NSPropertyListSerialization propertyListFromData:plistData mutabilityOption:NSPropertyListImmutable format:&format errorDescription:&error];
[NSJSONSerialization JSONObjectWithData:myData options:0 error:nil];
[dataWithJSONObject:myDictionary options:0 error:nil];
目前看来,保证工作的唯一途径似乎是:
编写大量代码以输出详细XML
或JSON
,将其转换为NSData
,然后将转换回到NSString
,在电线上发送。
其他任何东西的成功率都略低于100%。不幸的是,这种技术将一个非常常见的问题(字符串 - >字典 - >字符串)转换为我们不应该编写的多行傻瓜样板代码。
另外...... XML
- 或 - JSON
方法是唯一正确报告失败的方法(如果它们发生) - 编码系统都需要NSError
个指针。
答案 0 :(得分:10)
Apple提供词典 - >没有反向的字符串方法
咦?假。不,你不应该依赖description
。改为使用属性列表。
前锋:
NSData *plist = [NSPropertyListSerialization
dataWithPropertyList:theDict
format:NSPropertyListXMLFormat_v1_0
options:kNilOptions
error:NULL];
NSString *str = [[NSString alloc] initWithData:plist encoding:NSUTF8StringEncoding];
向后:
NSDictionary *dict = [NSPropertyListSerialization
propertyListWithData:[str dataUsingEncoding:NSUTF8StringEncoding]
options:kNilOptions
format:NULL
error:NULL];
旁注:
只要您的词典只是基本数据类型
,它就能完美运行
这些被称为“属性列表对象”。
答案 1 :(得分:2)
你想要的是:
id<nscoding> obj;
NSData * data = [NSKeyedArchiver archivedDataWithRootObject:obj];
NSString * string = [data base64EncodedString];
然后反过来
NSString * string;
NSData * data = [NSData dataFromBase64String:string];
id<nscoding> obj = [NSKeyedUnarchiver unarchiveObjectWithData:data]
您可以使用此处提供的NSData类别添加base64EncodedString和dataFromBase64String:NSData+Base64
当您尝试编码非utf8字符串数据的内容时,NSUTF8StringEncoding返回nil。