【问题标题】:Why this code with NSJSONSerialization always crashes?为什么这个带有 NSJSONSerialization 的代码总是崩溃?
【发布时间】:2013-03-10 15:53:23
【问题描述】:
//
//  main.m
//  ASADeepDictionary
//
//  Created by AndrewShmig on 3/10/13.
//  Copyright (c) 2013 AndrewShmig. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "ASADeepDictionary.h"

int main(int argc, const char * argv[])
{
 @autoreleasepool {

NSDictionary *dic = @{@"key":@"value"};
NSMutableData *data = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];

[archiver encodeObject:dic];
[archiver finishEncoding];

id json = [NSJSONSerialization
           dataWithJSONObject:data
           options:0
           error:nil];

NSLog(@"%@", json);

 }

 return 0;
}

我得到的错误是:

2013-03-10 19:48:13.420 ASADeepDictionary[9451:303] *** Terminating app due to uncaught    exception 'NSInvalidArgumentException', reason: '*** +[NSJSONSerialization dataWithJSONObject:options:error:]: Invalid top-level type in JSON write'
*** First throw call stack:
 (
    0   CoreFoundation                      0x00007fff89fb70a6 __exceptionPreprocess + 198
    1   libobjc.A.dylib                     0x00007fff88fac3f0 objc_exception_throw + 43
    2   CoreFoundation                      0x00007fff89fb6e7c +[NSException raise:format:] + 204
    3   Foundation                          0x00007fff848bb49d +[NSJSONSerialization dataWithJSONObject:options:error:] + 249
    4   ASADeepDictionary                   0x0000000100001051 main + 321
    5   libdyld.dylib                       0x00007fff84bfd7e1 start + 0
    6   ???                                 0x0000000000000001 0x0 + 1

【问题讨论】:

    标签: objective-c nsjsonserialization


    【解决方案1】:

    第一个参数必须是 NSDictionaryNSArray,而不是 NSData。您似乎误解了此方法的作用。它序列化传入的对象,而不是解析它。

    【讨论】:

    • 假设我发送一个 NSString 那么它应该返回一个错误但它崩溃了??
    • @user1010819 为什么要返回错误?你违反了约束(你传递了一个字符串而不是字典)。
    • 是的,我明白了!!。现在我在将它传递给方法之前检查它是否是一个有效的 JSOn 对象。但是它什么时候会返回错误。我假设如果不传递正确的JSON 对象会返回一个错误。
    • @user1010819 不要假设,而是阅读文档。
    【解决方案2】:
    NSDictionary *dic = @{@"key":@"value"};
    
    id json = [NSJSONSerialization
               dataWithJSONObject:dic
               options:0
               error:nil];
    
    NSLog(@"%@", [NSString stringWithUTF8String:[json bytes]]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-28
      • 1970-01-01
      • 1970-01-01
      • 2011-01-06
      • 2014-02-03
      • 1970-01-01
      • 2010-11-23
      • 1970-01-01
      相关资源
      最近更新 更多