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 に戻す方法はありません (変換プロセスは元に戻せるように設計されているため)。したがって、属性にアクセスしnode[@"@name"]、子にアクセスする必要があります。node[@"name"]

将来、サービスが属性からノードに変更された場合は、コードを調整する必要があります。しかし、それはすべてのフォーマット変更に当てはまります...

于 2013-09-03T00:07:28.750 に答える
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 に答える
0

JSON ドキュメントには 2 つのオブジェクトがあり、それぞれに @ 文字で始まる 3 つのキーがあります。NSJSONSerialization はそれを完全に正しく解析し、各オブジェクトに対して、それぞれ「@」で始まる 3 つのキーを持つ NSDictionary を提供します。あなたが何を望んでいても、それはJSON文書にあるものであり、それを解析すると得られるものです.

これらのキーに @ 文字が含まれるべきではないと思われる場合は、解析している JSON ドキュメントの作成者に相談してください。

于 2014-02-12T23:53:57.263 に答える