无法解析 json

Posted

技术标签:

【中文标题】无法解析 json【英文标题】:Unable to parse json 【发布时间】:2012-02-07 10:48:18 【问题描述】:

我正在尝试解析 twitter 返回的 json。 json 检索得很好,我将其转换为 NSDictionary,

字典对象上的 NSLog 运行良好并显示所有推文。

NSLog(@"Twitter response: %@", dict);

但是当我尝试为 dict 对象中的任何键获取 objectForKey 时出现以下错误:

2012-02-07 15:35:28.988 TestTweetApp[1525:12103] -[__NSCFArray objectForKey:]: 无法识别的选择器发送到实例 0x6a2a370 [切换到进程 1525 线程 0x12103] [切换到进程 1525 线程 0x12103] 2012-02-07 15:35:28.997 TestTweetApp [1525:12103] * 由于未捕获的异常而终止应用程序 'NSInvalidArgumentException',原因:'-[__NSCFArray objectForKey:]: 无法识别的选择器发送到实例 0x6a2a370' * 第一次抛出调用栈:(0x176e052 0x1a40d0a 0x176fced 0x16d4f00 0x16d4ce2 0x3044 0xd306 0x2048445 0x2049ecf 0x2049d28 0x20494af 0x9ca1fb24 0x9ca216fe) 终止称为抛出 exceptionsharedlibrary apply-load-rules all

viewDidLoad() 函数的代码是:

- (void)viewDidLoad

    [super viewDidLoad];

    TWRequest *request = [[TWRequest alloc] initWithURL:[NSURL URLWithString: @"https://api.twitter.com/1/statuses/public_timeline.json?screen_name=[SOME_USER_NAME]&include_entities=true"] parameters:nil requestMethod:TWRequestMethodGET];

    [request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error)
    
        if ([urlResponse statusCode] == 200) 
        
            NSError *error;  

            NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&error];

            NSLog(@"Twitter response: %@", [dict objectForKey:@"entities"]);
        
        else
            NSLog(@"Twitter error, HTTP response: %i", [urlResponse statusCode]);
    ];


【问题讨论】:

【参考方案1】:

您的回复似乎是NSArray,而不是NSDictionary。试试

NSLog(@"%@", [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&error]);

在你之前

NSDictionary *dict... 

行并查看格式。 然后将其移动到 NSArray 并正确访问元素。

NSArray *response = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&error];
NSLog(@"elements = %@", response);

【讨论】:

【参考方案2】:

如果您不确定响应格式或可能有多种可能的响应格式,并且您还需要处理错误,您可以使用任何自省方法,如isKindOfClassrespondsToSelector 来确定 JSONObjectWithData 返回的类型

id responseData = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&error];

if([responseData respondsToSelector:@selector(objectForKey:)])
   //Response is of type NSdictionary
   NSLog(@"Twitter response: %@", [responseData objectForKey:@"entities"]);
else if ([responseData respondsToSelector:@selector(objectAtIndex:)])
        //Response is of type NSArray
      
      else
         // error 
      

【讨论】:

您在这两种情况下都在检查respondsToSelector:@selector(objectForKey:) 更正:在 NSArray 的情况下应该是 @selector(objectAtIndex:) 这当然有效,但是如果对象是 NSDictionary 与 NSArray 的目的是做不同的事情,为什么不明确检查呢? if ([responseData isKindOfClass:[NSDictionary class]]) ... else if ([responseData isKindOfClass:[NSArray class]]) ... 当意图明确时,您的代码变得更具可读性。

以上是关于无法解析 json的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 无法解析 JSON

我无法从 Instagram api 解析 json

无法使用 Codeable 解析 JSON

无法解析 Reddit Json [重复]

无法使用闭包使用 alamofire 解析 json

NSJSONSerialization 无法解析有效的 JSON - “垃圾结束”