5

这方面已经有很多问题了,但给出的答案是针对具体情况的,回答的是发帖人的个人问题,而​​不是问题的标题。

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

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

这是我知道/测试过的:

  1. Apple 提供了一个没有逆向的Dictionary->String方法,只要您的 Dictionary 只是基本的数据类型、数组和字典,它就可以完美地工作。这涵盖了大多数现实世界的情况,但苹果没有给出相反的情况:(。
    1. [myDictionary description];
    2. // 无路可返 ?为什么不?
  2. Apple 有一种中间方法使用NSData它静默失败,因此它仅适用于有限的一组实际案例:
    1. [myString dataUsingEncoding:NSUTF8StringEncoding];
    2. [[NSString alloc] initWithData:myData encoding:NSUTF8StringEncoding];// 注意:在很多情况下会静默失败,返回 nil 字符串
  3. Apple有多种不兼容的转换方式NSDictionary-> NSData->NSDicitonary效果很好-但它们正在使用NSData,因此它们不是直接转换,并且更难使用
    1. KeyedArchiver:
      1. [NSKeyedArchiver archivedDataWithRootObject:myDictionary];
      2. [NSKeyedUnarchiver unarchiveObjectWithData:myData];
    2. 属性列表序列化:
      1. [NSPropertyListSerialization dataFromPropertyList:plist format:NSPropertyListXMLFormat_v1_0 errorDescription:&error];
      2. [NSPropertyListSerialization propertyListFromData:plistData mutabilityOption:NSPropertyListImmutable format:&format errorDescription:&error];
    3. NSJSON序列化:
      1. [NSJSONSerialization JSONObjectWithData:myData options:0 error:nil];
      2. [dataWithJSONObject:myDictionary options:0 error:nil];

就目前而言,保证工作的唯一途径似乎是:

编写大量代码以输出详细的XMLor JSON,将其转换为,NSData然后再转换NSString,并将其发送到网络上。

其他任何事情的成功率都略低于 100%。不幸的是,这种技术将一个非常常见的问题(字符串 -> 字典 -> 字符串)变成了我们不应该编写的多行愚蠢的样板代码块。

此外...... XML- 或 -JSON方法是唯一正确报告故障(如果发生)的方法 - 两种编码系统都采用NSError指针。

4

2 回答 2

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];

向后:

NSDictionary *dict = [NSPropertyListSerialization
    propertyListWithData:[str dataUsingEncoding:NSUTF8StringEncoding]
                 options:kNilOptions
                  format:NULL
                   error:NULL];

边注:

只要您的字典只是基本数据类型,就可以完美地工作

这些被称为“属性列表对象”。

于 2013-07-12T14:11:55.020 回答
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]

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

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

于 2013-07-12T14:07:15.547 回答