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

时间:2013-07-12 14:02:46

标签: ios nsstring nsdictionary nsdata

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

我想知道是否有一种通用,通用,简便的方法将NSString转换为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]; //注意:在许多情况下默默地失败,返回nil string
  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];
  4. 目前看来,保证工作的唯一途径似乎是:

    编写大量代码以输出详细XMLJSON,将其转换为NSData,然后将转换回NSString,在电线上发送。

    其他任何东西的成功率都略低于100%。不幸的是,这种技术将一个非常常见的问题(字符串 - >字典 - >字符串)转换为我们不应该编写的多行傻瓜样板代码。

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

2 个答案:

答案 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。