解析JSON:检查对象是否存在以及读取值

时间:2012-12-17 17:56:36

标签: objective-c json cocoa nsjsonserialization

我的应用程序返回NSMutableData *receivedData

我选择使用NSJSONSerialization来解析它,假设它是最简单的。我在试图弄清楚如何做到这一点时遇到了极大的麻烦。我是Objective-C的新手,来自Java背景。

在Java中,我使用gson将JSON解析为一个我可以轻松使用的数组。我在这里真的很挣扎。

我目前解析JSON的代码是:

NSError *e = nil;
    NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData: receivedData options: NSJSONReadingMutableContainers error: &e];

    if (!jsonArray) {
        NSLog(@"Error parsing JSON: %@", e);
    } else {
        for(NSDictionary *item in jsonArray) {
            NSLog(@"Item: %@", item);
        }
    }

由互联网上的某人提供。这适用于NSLog打印两个项目。 resultheader。以下是JSON的外观:

{
  "header":{
    "session":"sessionid",
    "serviceVersion":"1",
    "prefetchEnabled":true
  },
  "result":"50ce82401e826"
}

但是如果出现错误,JSON也可能如下所示:

{
  "header":{
    "session":"sessionid",
    "serviceVersion":"1",
    "prefetchEnabled":true
  },
  "fault":{
    "code":0,
    "message":"someErrorCode"
  }
}

我希望代码如何工作:

  1. 检查是否存在“故障”对象
  2. 如果有,打印fault.code和fault.message到NSLog
  3. 如果没有,我知道我的JSON包含结果而不是错误
  4. 将结果值打印到NSLog
  5. 但我不能为我的生活弄清楚如何接近它。有人可以给我一些指示吗?

1 个答案:

答案 0 :(得分:0)

您的对象似乎是字典。

试试这个。

NSError *e = nil;
id jsonObj = [NSJSONSerialization JSONObjectWithData: receivedData options: NSJSONReadingMutableContainers error: &e];

NSArray *jsonArray = nil;
NSDictionary *jsonDict = nil;

if ([jsonObj isKindOfClass:[NSArray class]]){
    jsonArray = (NSArray*)jsonObj;
}
else if ([jsonObj isKindOfClass:[NSDictionary class]]){
    jsonDict = (NSDictionary*)jsonObj;
}

if (jsonArray != nil) {
    // you have an array;
    for(NSDictionary *item in jsonArray) {
        NSLog(@"Item: %@", item);
    }
}
else if (jsonDict != nil){
    for (NSString *key in jsonDict.allKeys){
        NSLog(@"Key: %@ forItem: %@",key,[jsonDict valueForKey:key]);
    }
}
else {
    NSLog(@"Error: %@",e);
}