0

我的应用程序返回一个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

但我无法终生弄清楚如何处理它。有人可以给我一些指示吗?

4

1 回答 1

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);
}
于 2012-12-17T18:15:34.503 回答