Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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 使用NSJSONSerialization解析JSON属性_Objective C_Json_Nsdictionary_Nsjsonserialization_Mknetworkkit - Fatal编程技术网

Objective c 使用NSJSONSerialization解析JSON属性

Objective c 使用NSJSONSerialization解析JSON属性,objective-c,json,nsdictionary,nsjsonserialization,mknetworkkit,Objective C,Json,Nsdictionary,Nsjsonserialization,Mknetworkkit,我被困在如何解析属性化JSON对象上。我设法解析JSON对象并得到一个整洁的NSDictionary,但是我得到的属性是@“xxx”文本。。这是不可取的 我猜这和我有关,但我找不到它应该是什么 这是JSON对象: { "sport": [ { "@description": "Fotboll", "@id": "1", "@name": "SOCCER" }, {

我被困在如何解析属性化JSON对象上。我设法解析JSON对象并得到一个整洁的
NSDictionary
,但是我得到的属性是
@“xxx”
文本。。这是不可取的

我猜这和我有关,但我找不到它应该是什么

这是JSON对象:

{
    "sport": [
        {
            "@description": "Fotboll",
            "@id": "1",
            "@name": "SOCCER"
        },
        {
            "@description": "Ishockey",
            "@id": "2",
            "@name": "HOCKEY"
        }
    ]
}
这是我的结果字典:

2013-08-26 22:46:44.461 OddsApp[21971:70b] __50-[GetSportsService getSportsOnCompletion:onError:]_block_invoke [Line 43] JSON: 
{
    sport =     (
                {
            "@description" = Fotboll;
            "@id" = 1;
            "@name" = SOCCER;
        },
                {
            "@description" = Ishockey;
            "@id" = 2;
            "@name" = HOCKEY;
        }
    );
}
{
    sport =     (
                {
            "description" = Fotboll;
            "id" = 1;
            "name" = SOCCER;
        },
                {
            "description" = Ishockey;
            "id" = 2;
            "name" = HOCKEY;
        }
    );
}
这是我的代码:

-(void)getSportsOnCompletion:(void (^)(NSArray *sports))completionBlock onError:(MKNKErrorBlock)errorBlock
{
    [self addCompletionHandler:^(MKNetworkOperation *completedOperation) {
        DLog(@"%@: %@", [completedOperation isCachedResponse] ? @"Cache" : @"Response", [completedOperation responseString]);

        NSError *err = nil;
        id json = [NSJSONSerialization JSONObjectWithData:[completedOperation responseData]
                                                  options:kNilOptions
                                                    error:&err];
        if(err)
        {
            errorBlock(err);
            return;
        }

        DLog(@"JSON: \n%@", json);

        NSArray *array = [(NSDictionary *)json objectForKey:@"sport"];
        NSMutableArray *sports = [NSMutableArray arrayWithCapacity:array.count];

        for(NSDictionary *item in array) {
            [sports addObject:[Sport instanceFromDictionary:item]];
        }

        completionBlock([NSArray arrayWithArray:sports]);
    } errorHandler:^(MKNetworkOperation *completedOperation, NSError *error) {
        errorBlock(error);
    }];

    [ApplicationDelegate.networkEngine enqueueOperation:self forceReload:YES];
}
我希望得到的结果是:

2013-08-26 22:46:44.461 OddsApp[21971:70b] __50-[GetSportsService getSportsOnCompletion:onError:]_block_invoke [Line 43] JSON: 
{
    sport =     (
                {
            "@description" = Fotboll;
            "@id" = 1;
            "@name" = SOCCER;
        },
                {
            "@description" = Ishockey;
            "@id" = 2;
            "@name" = HOCKEY;
        }
    );
}
{
    sport =     (
                {
            "description" = Fotboll;
            "id" = 1;
            "name" = SOCCER;
        },
                {
            "description" = Ishockey;
            "id" = 2;
            "name" = HOCKEY;
        }
    );
}

解析器非常好。您是对的,它可能是XML转换的结果,请参见例如“”

如果解析器只是删除前导的“@”,就无法将JSON转换回XML(因为转换过程是可逆的),因此您必须通过
node[@“@name”]
访问属性,通过
node[@“name”]


如果将来服务从属性更改为节点,则必须调整代码。但每一次格式更改都是如此…

解析器非常好。您是对的,它可能是XML转换的结果,请参见例如“”

如果解析器只是删除前导的“@”,就无法将JSON转换回XML(因为转换过程是可逆的),因此您必须通过
node[@“@name”]
访问属性,通过
node[@“name”]


如果将来服务从属性更改为节点,则必须调整代码。但每一次格式更改都是如此…

您的JSON文档有两个对象,每个对象有三个以@字符开头的键。NSJSONSerialization绝对正确地解析它,并为每个对象提供一个NSDictionary,其中包含三个键,每个键以“@”开头。不管您想要什么,这就是JSON文档中的内容,也是您解析它时得到的内容


如果您认为这些键中不应该有@字符,那么请与创建您正在解析的JSON文档的人交谈

JSON文档有两个对象,每个对象有三个以@字符开头的键。NSJSONSerialization绝对正确地解析它,并为每个对象提供一个NSDictionary,其中包含三个键,每个键以“@”开头。不管您想要什么,这就是JSON文档中的内容,也是您解析它时得到的内容


如果您认为这些键中不应该有@字符,那么请与创建您正在解析的JSON文档的人交谈

解析属性化JSON对象非常简单。假设我有一个JSON响应,如下所示:

{
  "Header": {
    "OriginalMessageID": "12345678",
    "TimeStamp": "2016-05-11T14:48:34.627",
    "Operation": {
      "@attributes": {
        "Data": "PlayerPIN",
        "Operand": "Validate",
        "Success": "Yes"
      }
    }
  },
  "PlayerID": "68700"
}
我想得到键
@attributes
的值,那么我们应该做的是:

-(void)userLogin {
    dictOfUser = [self getResponse:[NSString stringWithFormat:@"%@",@"http://waterview.gaganation.com/members/casinoWebServices/loginWebService.php?playerId=68700&pinNumber=1234"]];

    NSMutableDictionary *temp = [[dictOfUser valueForKey:@"Header"]valueForKey:@"Operation"];
    if([[temp[@"@attributes"] valueForKey:@"Success"]isEqualToString:@"Yes"]) {
        NSLog(@"Login success..!");
    } else {
        NSLog(@"User Login Failed");
    }
}

解析属性化JSON对象非常简单。假设我有一个JSON响应,如下所示:

{
  "Header": {
    "OriginalMessageID": "12345678",
    "TimeStamp": "2016-05-11T14:48:34.627",
    "Operation": {
      "@attributes": {
        "Data": "PlayerPIN",
        "Operand": "Validate",
        "Success": "Yes"
      }
    }
  },
  "PlayerID": "68700"
}
我想得到键
@attributes
的值,那么我们应该做的是:

-(void)userLogin {
    dictOfUser = [self getResponse:[NSString stringWithFormat:@"%@",@"http://waterview.gaganation.com/members/casinoWebServices/loginWebService.php?playerId=68700&pinNumber=1234"]];

    NSMutableDictionary *temp = [[dictOfUser valueForKey:@"Header"]valueForKey:@"Operation"];
    if([[temp[@"@attributes"] valueForKey:@"Success"]isEqualToString:@"Yes"]) {
        NSLog(@"Login success..!");
    } else {
        NSLog(@"User Login Failed");
    }
}

我在赏金信息中的意思当然是“我非常感谢您的帮助”。我看到的当前和所需put之间的唯一区别是键开头的
@
,对吗?或者我遗漏了什么?为什么JSON解析器对待“@”符号与UTF-8中编码的任何其他字符不同?属性不是JSON的有效扩展,这意味着您必须自己进行字符串操作,才能按自己的方式解析键,或者编写自己的解析器。@CodaFi给我的印象是,当从XML解析时,JSON就是这样显示属性的。json对象是从一个Java spring服务返回的(如果我没有错的话),该服务支持不同的接受类型(例如XML)。我在赏金消息中的意思当然是“我非常感谢您的帮助”。我看到的当前和所需put之间的唯一区别是键开头的
@
,对吗?或者我遗漏了什么?为什么JSON解析器对待“@”符号与UTF-8中编码的任何其他字符不同?属性不是JSON的有效扩展,这意味着您必须自己进行字符串操作,才能按自己的方式解析键,或者编写自己的解析器。@CodaFi给我的印象是,当从XML解析时,JSON就是这样显示属性的。json对象是从支持不同接受类型(例如XML)的Java spring服务返回的(如果我没有错的话)。我发现您的答案是最正确的答案,因为json中没有属性支持,因此
NSJSONSerialization
中没有错误。非常感谢。我发现您的答案是最正确的,因为Json中没有属性支持,因此
NSJSONSerialization
中没有错误。非常感谢。