【问题标题】:NSString to NSDictionary as objectNSString 到 NSDictionary 作为对象
【发布时间】:2014-08-06 20:07:28
【问题描述】:

我有NSString 代表NSDictionary

我创建了这样的字符串:

 NSString * insertionStr = [dictionary description];

现在我想把它转换回NSDictionary

有可能吗?

【问题讨论】:

  • 这并没有“转换”字典 - 它仍然是一个。您所做的只是创建它的 NSString 表示。你在哪里声明“字典”变量?那是局部变量吗? @property?
  • 请详细说明您为什么要这样做。老实说,我怀疑这是解决问题的方法。来自 Apple 的描述方法文档 此方法旨在为调试目的生成可读输出,而不是用于序列化数据。 如果您希望序列化字典并将其存储在文件中,请参阅属性列表编程引导或归档并取消归档字典。
  • 您根本没有“作为字典的字符串”。这是不可能的,因为它本来就不是字典。
  • @LevLandau 我试图将该字典存储在NSUSerDefaults 中,但它把错误归咎于我:(,所以我将它的表示存储为NSString,现在我想将它提取回来字典
  • @mc01 字典是一个局部变量

标签: ios nsstring nsdictionary


【解决方案1】:

要将字典保存到文件(或其他介质)并在以后恢复,您应该使用 JSON 或 plist 格式。

对于 JSON,您的数据必须限制为字典、数组、字符串和 NSNumber 的组合。对于 plist,它必须是其中之一或 NSDate 或 NSData。

对于 JSON,您可以使用 NSJSONSerialization 的方法转换为 NSData,然后将数据保存到文件中。要恢复,请将文件加载到 NSData 并通过 NSJSONSerialization 运行。

对于 plist 格式,使用 NSDictionary writeToFiledictionaryWithContentsOfFile 方法。

请注意,默认情况下,您返回的对象是不可变的。如果你想要 JSON 中的可变对象,JSONObjectWithData 上有一个名为 NSJSONReadingMutableContainers 的选项。对于 plist,我认为您需要使用更复杂的 plist 接口(与使用简单的 NSDictionary 接口相比),以便您指定类似的选项。

【讨论】:

    【解决方案2】:

    来自setObject:forKey 的 NSUserDefaults 文档

    value 参数只能是属性列表对象:NSData、NSString、NSNumber、NSDate、NSArray 或 NSDictionary。对于 NSArray 和 NSDictionary 对象,它们的内容必须是属性列表对象。

    如果您的字典包含非属性列表对象,如果字典中的所有对象都实现NSCoding,您可以将其归档并存储到文件中。

    【讨论】:

    • 他为什么要使用 NSUserDefaults 而不是普通的字典?
    • 他试图将他的字典存储在 NSUserDefaults 中。
    【解决方案3】:

    基于问题和 cmets,我会说...不...不要那样做NSUserDefaults 具有存储对象值的能力,并且非常适合存储 NSDictionary

    [[NSUserDefaults standardUserDefaults] setObject: dictionary forKey:@"DetailDict"];
    [[NSUserDefaults standardUserDefaults] synchronize];
    

    并使用它来检索它

    NSDictionary *retrievedDictionary = [[NSUserDefaults standardUserDefaults] dictionaryForKey:@"DetailDict"];
    

    如果您想将其保存为字符串,请查看 this question,在检索值时只需将字符串转换回 Object

    【讨论】:

    【解决方案4】:

    字典表示为键/值对。您可以像这样创建具有单个值的字典:

    NSDictionary *dictionary = @{@"name": @"Mike"};
    

    您还可以存储多个键/值对:

    NSDictionary *newDictionary = @{
                                    @"firstName": @"Mike",
                                    @"lastName": @"Smith"
                                   };
    

    稍后,如果您想从字典中取回值,请使用键从字典中取回值:

    NSString *first = newDictionary[@"firstName"];
    NSString *last = newDictionary[@"lastName"];
    
    // first will now be @"Mike" and last will be @"Smith"
    

    将字典想象成一个数组,但不是使用索引(数字)来引用您使用键(字符串)的值。

    根据评论,如果您还想存储字典数组,您可以这样做:

    NSDictionary *firstDictionary = @{@"key": @"value"};
    NSDictionary *secondDictionary = @{@"anotherKey": @"anotherValue"};
    NSArray *array = @[firstDictionary, secondDictionary];
    

    【讨论】:

    • 我不确定你是否理解这个问题。
    • 原来的问题?
    • 嗯,以及使用 cmets 取得的进展,这仍然是原始问题的一部分。由于对象不符合要求,用户在将字典存储在 NSUserDefaults 时遇到问题,因此他使用字符串解决了该问题。您的回答似乎没有提供任何解决方案。
    • 我没有阅读每个回复的每条评论,我解决了原始问题,其中没有提到任何关于 NSUserDefaults...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多