Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 解析JSON:检查对象是否存在并读取值_Objective C_Json_Cocoa_Nsjsonserialization - Fatal编程技术网

Objective c 解析JSON:检查对象是否存在并读取值

Objective c 解析JSON:检查对象是否存在并读取值,objective-c,json,cocoa,nsjsonserialization,Objective C,Json,Cocoa,Nsjsonserialization,我的应用程序返回一个NSMutableData*receivedData 我选择使用NSJSONSerialization来解析它,因为我认为这是最简单的。我在想怎么做时遇到了极大的困难。我对Objective-C非常陌生,有Java背景 在Java中,我使用gson将JSON解析到一个数组中,我可以很容易地使用这个数组。我在这里真的很挣扎 我目前解析JSON的代码是: NSError *e = nil; NSArray *jsonArray = [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<代码>结果和
标题
。以下是JSON的外观:

{
  "header":{
    "session":"sessionid",
    "serviceVersion":"1",
    "prefetchEnabled":true
  },
  "result":"50ce82401e826"
}
但是,如果出现错误,JSON也可以如下所示:

{
  "header":{
    "session":"sessionid",
    "serviceVersion":"1",
    "prefetchEnabled":true
  },
  "fault":{
    "code":0,
    "message":"someErrorCode"
  }
}
我希望代码如何工作:

  • 检查是否存在“故障”对象
  • 如果存在,则将fault.code和fault.message打印到NSLog
  • 如果没有,我知道JSON包含的是结果而不是错误
  • 将结果的值打印到NSLog

  • 但我一辈子都不知道该怎么做。有人能给我一些指点吗?

    你的东西好像是一本字典

    试试这个

    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);
    }
    

    请注意,您的
    jsonArray
    将是
    NSDictionary
    ,而不是
    NSArray
    。顺便说一句,这很简单:检查与
    fault
    键对应的对象是否为
    nil
    。是的,从阅读文档中可以看出,所有对象(如
    header
    fault
    )都是
    NSDictionary
    s?然后,
    result
    将是一个
    NSString
    ?@jordanmore-Yes,确切地说。NSLog在解析第一个json示例时将“item”打印为纯文本名称,纯文本字符串为“result”和“header”。你知道我怎么把它写进if语句吗?我的尝试一直在尝试,但失败了。。。我希望能够做的是
    if(item==@“result”){/*do something*/}
    ,因为您无法理解转换为什么以及JSON解析如何工作。请阅读developer.apple.com上的属性列表编程指南。谢谢,这段代码完美地向我展示了如何实现我需要做的事情:)