4

我在我的应用程序中收到一些 json 数据:

NSMutableDictionary *json = [NSJSONSerialization JSONObjectWithData:jsonResponse options:NSJSONReadingAllowFragments error:nil];
        NSLog(@"json :%@", json);

其中记录:

json :{
  "email" : "/apex/emailAttachment?documentId=00PZ0000000zAgSMAU&recipientId=003Z000000XzHmJIAV&relatedObjectId=a09Z00000036kc8IAA&subject=Pricing+Comparison"
}

这正是我想要的。

但是,当我去阅读电子邮件的价值时

[json objectForKey:@"email"]

我收到一个无效的参数异常:

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“ * -[NSDictionary initWithDictionary:copyItems:]:字典参数不是 NSDictionary”

我怎样才能读取这个值?

4

2 回答 2

4

似乎您的服务器发送“嵌套 JSON”:jsonResponse是一个 JSON字符串(不是 字典)。该字符串的值再次是表示字典的 JSON 数据。

在这种情况下,您必须对 JSON 进行两次反序列化:

NSString *jsonString = [NSJSONSerialization JSONObjectWithData:jsonResponse options:NSJSONReadingAllowFragments error:nil];
NSData *innerJson = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:innerJson options:0 error:nil];

NSString *email = jsonDict[@"email"];
于 2013-10-22T19:14:48.990 回答
1

'json' 对象显然不是字典,因此是错误的。

你传递的NSJSONReadingAllowFragments标志是JSONObjectWithData:options:error:

指定解析器应该允许不是 NSArray 或 NSDictionary 实例的顶级对象。

您需要检查从方法返回的对象的类类型。

此外,您会误以为您会从方法调用中获得一个可变实例。如果您希望返回一个可变实例,您需要使用NSJSONReadingMutableContainers可变数组/dics 或NSJSONReadingMutableLeaves可变字符串

于 2013-10-22T19:37:52.430 回答