将NSString转换为NSDictionary,将NSDictionary转换为NSString

Ada*_*dam 5 nsdictionary nsstring nsdata ios

关于这个问题已有很多问题,但所给出的答案都是针对特定情况的,回答了海报的个人问题,而​​不是问题标题.

我想知道是否有一种通用的,通用的,简单的方法将a转换NSString为a NSDictionary,反之亦然?

我有困难/复杂/非跨平台的方法,但肯定有一个更简单的方法吗?

这是我所知道/经过测试的:

  1. Apple提供了一个没有反转的Dictionary- > String方法,只要你的Dictionary只是基本数据类型,数组和字典,它就能完美运行.这涵盖了大多数现实世界的案例,但Apple没有反过来:(.
    1. [myDictionary description];
    2. // 无路可退 ?为什么不?
  2. Apple使用的中间方法NSData无声地失败,因此它仅适用于一组有限的实际情况:
    1. [myString dataUsingEncoding:NSUTF8StringEncoding];
    2. [[NSString alloc] initWithData:myData encoding:NSUTF8StringEncoding]; // NB:在许多情况下默默地失败,返回nil字符串
  3. Apple有多种,不兼容的转换方式NSDictionary- > NSData- >运行NSDicitonary良好 - 但它们正在使用NSData,因此它们不是直接转换,而且它们更难以使用
    1. KeyedArchiver:
      1. [NSKeyedArchiver archivedDataWithRootObject:myDictionary];
      2. [NSKeyedUnarchiver unarchiveObjectWithData:myData];
    2. PropertyListSerialization:
      1. [NSPropertyListSerialization dataFromPropertyList:plist format:NSPropertyListXMLFormat_v1_0 errorDescription:&error];
      2. [NSPropertyListSerialization propertyListFromData:plistData mutabilityOption:NSPropertyListImmutable format:&format errorDescription:&error];
    3. NSJSONSerialization:
      1. [NSJSONSerialization JSONObjectWithData:myData options:0 error:nil];
      2. [dataWithJSONObject:myDictionary options:0 error:nil];

目前,唯一可以保证工作的路线似乎是:

编写大量的代码输出冗长XML或者JSON,将其转换为NSData,然后转换回成NSString,并发送上线.

其他任何东西的成功率都略低于100%.不幸的是,这种技术将一个非常常见的问题(字符串 - >字典 - >字符串)变成了一个我们不应该编写的多线模板代码.

此外... XML-or- JSON方法是唯一正确报告失败的方法(如果它们发生) - 编码系统都需要NSError指针.

小智 10

Apple提供了一个没有反转的Dictionary - > String方法

咦?假.不,你不应该依赖description.请改用属性列表.

前锋:

NSData *plist = [NSPropertyListSerialization
    dataWithPropertyList:theDict
                  format:NSPropertyListXMLFormat_v1_0
                 options:kNilOptions
                   error:NULL];

NSString *str = [[NSString alloc] initWithData:plist encoding:NSUTF8StringEncoding];
Run Code Online (Sandbox Code Playgroud)

向后:

NSDictionary *dict = [NSPropertyListSerialization
    propertyListWithData:[str dataUsingEncoding:NSUTF8StringEncoding]
                 options:kNilOptions
                  format:NULL
                   error:NULL];
Run Code Online (Sandbox Code Playgroud)

边注:

只要您的词典只是基本数据类型,它就能完美运行

那些被称为"属性列表对象".


Nic*_*ini 2

你想要的是:

id<nscoding> obj;

NSData * data     = [NSKeyedArchiver archivedDataWithRootObject:obj];
NSString * string = [data base64EncodedString];
Run Code Online (Sandbox Code Playgroud)

然后反过来

NSString * string;

NSData * data    = [NSData dataFromBase64String:string];
id<nscoding> obj = [NSKeyedUnarchiver unarchiveObjectWithData:data]
Run Code Online (Sandbox Code Playgroud)

您可以添加 base64EncodedString 和 dataFromBase64String: 以及此处提供的 NSData 类别NSData+Base64

当您尝试对不是由 utf8 字符串组成的数据的内容进行编码时,NSUTF8StringEncoding 将返回 nil。