1

특성이있는 JSON 개체를 구문 분석하는 방법에 대해 고민하고 있습니다. 나는 JSON 객체를 파싱하고 깔끔한 NSDictionary을 얻을 수 있지만, 나는 @"xxx" 텍스트로 속성을 얻는다. 이것은 바람직하지 않다.NSJSONSerialization을 사용하여 JSON 특성을 구문 분석

나는 그것이 나와 연관이 있다고 생각하지만, options:kNilOptions이 무엇인지 알아낼 수 없습니다.

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

:

는 JSON 객체입니다 사전 :

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

나는 물론 의미 "정말 감사하겠습니다 어떤 도움이 "내 현상금 메시지에. –

+0

현재와 원하는 put 사이의 유일한 차이점은 키 시작 부분에'@'입니다. 맞습니까? 또는 나는 무엇인가 놓치고 있냐? –

+0

JSON 구문 분석기가 "@"기호를 UTF-8로 인코딩 된 다른 문자와 다르게 처리해야하는 이유는 무엇입니까? 속성은 JSON에 대한 유효한 확장이 아니므로 직접 키를 구문 분석하거나 자체 파서를 작성하기 위해 문자열 조작을 직접 수행해야합니다. – CodaFi

답변

1

파서는 완벽하게 훌륭합니다. 맞습니다. XML 변환의 결과 일 수 있습니다 (예 : "Converting Between XML and JSON"참조).

구문 분석기가 단순히 '@'로 끝나는 경우 JSON을 XML로 다시 변환 할 수 없으므로 (변환 프로세스는 되돌릴 수 있도록 설계되었으므로) node[@"@name"] 및 a로 속성에 액세스해야합니다. 자식 by node[@"name"]

나중에 서비스가 특성에서 노드로 변경되면 코드를 수정해야합니다. 하지만 모든 형식이 변경 될 때마다 마찬가지입니다 ...

+0

Json에서 애트리뷰트 지원이 없으므로 답이 가장 정확한 답을 찾았으므로 NSSSONSerialization에 오류가 없습니다. 고맙습니다! –

0

JSON 문서에는 두 개의 개체가 있으며 각 개체에는 @ 문자로 시작하는 세 개의 키가 있습니다. NSJSONSerialization은 정확하게 구문 분석하고 각 객체에 대해 "@"로 시작하는 세 개의 키가있는 NSDictionary를 제공합니다. 당신이 원하는 것을 중요시하지 않습니다. 그것은 JSON 문서에있는 것입니다. 그리고 JSON 문서를 파싱 할 때 얻고있는 것입니다.

이 키에 @ 문자가 없어야한다고 생각하면 파싱 할 JSON 문서를 만드는 사람과 이야기하십시오.

0

속성이있는 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"); 
    } 
}