我用 NSDictionary & JSON 序列化 & NSUserDefaults 错误地实现了啥?

Posted

技术标签:

【中文标题】我用 NSDictionary & JSON 序列化 & NSUserDefaults 错误地实现了啥?【英文标题】:What am I implementing incorrectly with NSDictionary & JSON serialization & NSUserDefaults?我用 NSDictionary & JSON 序列化 & NSUserDefaults 错误地实现了什么? 【发布时间】:2014-03-18 20:20:57 【问题描述】:

我认为我的错误与我没有正确实施我的 NSDictionary 有关。下面是我得到的错误代码。

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary bytes]: unrecognized selector sent to instance 0x16eab400'

错误发生在以下方法中:

- (void)check:(NSData *)json 
NSDictionary *json1 = [NSJSONSerialization
                     JSONObjectWithData:json
                      options:kNilOptions
                      error:nil];

NSUserDefaults *userdefaluts = [NSUserDefaults standardUserDefaults];
[userdefaluts setObject:[json1 objectForKey:@"Name"] forKey:@"name"];
[userdefaluts setObject:[json1 objectForKey:KEY_USER_ID] forKey:KEY_USER_ID];

NSLog(@"MainView - check - name: %@",[userdefaluts objectForKey:@"name"]);
NSLog(@"MainView - check - name: %@",[userdefaluts objectForKey:KEY_USER_ID]);

【问题讨论】:

检查作为参数传递的'json'对象是否肯定是NSData对象。看起来它实际上可以是 NSDictionary。 该方法有一个error 参数,但您传递了nil 并要求我们猜测问题所在。使用框架提供的工具。 谢谢@RafałAugustyniak。你的评论引导我走向正确的方向。我所要做的就是将 NSdata 更改为 NSDictionary。 【参考方案1】:

可能性:您的代码可能在后台线程上运行,而 NSUserDefaults 不喜欢它。 json1 上的 objectForKey 调用之一返回 nil 并且出现问题。我会将两个 [json1 objectForKey:...] 结果存储在一个局部变量中并 NSLog 它们。逐步调试调试器中的代码。

还有很大的可能性:您传入的对象“json”实际上不是 NSData。在上面做一个 NSLog 并检查它到底是什么。它可能是 NSDictionary* 而不是 NSData*,这可以解释为什么将用于 NSData(长度)的方法发送到 NSDictionary。检查对方法的调用。您是否传递了“id”类型的对象?

【讨论】:

您的巨大可能性实际上就是答案!我的数据是 NSDictionary!【参考方案2】:

您的数据可能是错误的,NSJSONSerializer 无法解析它,试试这个来显示是否有错误: NSError *jsonError; NSDictionary *json1 = [NSJSONSerialization JSONObjectWithData:json options:kNilOptions error:&jsonError]; 如果(json错误) NSLog(@"无法解析json数据,错误:%@",jsonError.localizedDescription);

【讨论】:

【参考方案3】:

所以答案很简单。我所要做的就是改变进入 NSDictionary 的数据类型。下面是正确的代码。

- (void)check:(NSDictionary *)json 
NSDictionary *json1 = [NSJSONSerialization
                 JSONObjectWithData:json
                  options:kNilOptions
                  error:nil];

NSUserDefaults *userdefaluts = [NSUserDefaults standardUserDefaults];
[userdefaluts setObject:[json1 objectForKey:@"Name"] forKey:@"name"];
[userdefaluts setObject:[json1 objectForKey:KEY_USER_ID] forKey:KEY_USER_ID];

NSLog(@"MainView - check - name: %@",[userdefaluts objectForKey:@"name"]);
NSLog(@"MainView - check - name: %@",[userdefaluts objectForKey:KEY_USER_ID]);

【讨论】:

以上是关于我用 NSDictionary & JSON 序列化 & NSUserDefaults 错误地实现了啥?的主要内容,如果未能解决你的问题,请参考以下文章

vue js 不按键对数组进行排序

iOS - 数组与字典(NSArray & NSDictionary)

将 NSDictionary 转换为 Swift 字典

正确检查 NSDictionary 结构

NSDictionary:将 NSString 键转换为小写以在其上搜索字符串

Objective-C 的 NSDictionary 的 Java 等价物是啥?