1

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

我猜它与我有关options:kNilOptions,但我找不到它应该是什么。

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

这是我的代码:

-(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];
}

我想作为结果字典得到什么:

{
    sport =     (
                {
            "description" = Fotboll;
            "id" = 1;
            "name" = SOCCER;
        },
                {
            "description" = Ishockey;
            "id" = 2;
            "name" = HOCKEY;
        }
    );
}
4

3 回答 3

1

解析器非常好。你是对的,它可能是 XML 转换的结果,例如“在 XML 和 JSON 之间转换”。

如果解析器只是删除前导的“@”,则无法将 JSON 转换回 XML(因为转换过程被设计为可逆),因此您必须访问属性 bynode[@"@name"]和子 bynode[@"name"]

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

于 2013-09-03T00:07:28.750 回答
0

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

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

于 2014-02-12T23:53:57.263 回答
0

解析一个属性化的 JSON 对象非常简单。假设我有这样的 JSON 响应:

{
  "Header": {
    "OriginalMessageID": "12345678",
    "TimeStamp": "2016-05-11T14:48:34.627",
    "Operation": {
      "@attributes": {
        "Data": "PlayerPIN",
        "Operand": "Validate",
        "Success": "Yes"
      }
    }
  },
  "PlayerID": "68700"
}

我想得到 key 的值@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");
    }
}
于 2016-05-11T19:59:21.557 回答