2012-05-02 4 views
0

안녕하세요, IOS에 json을 구문 분석하는 데 문제가 있습니다. 이것이 json 데이터입니다.Json 파싱이 IOS에서 잘못되었습니다.

{ 
"app_info": [ 
    { 
     "app_name": "haka", 
     "sync_protocol_version": "1" 
    } 
], 
"updates": [ 
    { 
     "timestamp": "Sat Apr 21 13:04:08 IST 2012", 
     "people": [ 
      { 
       "personal_info": [ 
        { 
         "first_name": "phlox", 
         "last_name": "", 
         "employee_id": "010", 
         "gender": "-", 
         "marital_status": "-", 
         "nationality": "Denobulan", 
         "dob": "re-23", 
         "photo": "http://c.cc/users/010/profile/image" 
        } 
       ], 
       "contact_details": [ 
        { 
         "address": [ 
          { 
           "street": "#1, this way", 
           "city": "tank", 
           "state": "sick bay", 
           "zip": "0978", 
           "country": "Enterprise" 
          } 
         ], 
         "telephone": [ 
          { 
           "work": "010", 
           "mobile": "010", 
           "home": "010" 
          } 
         ], 
         "email": [ 
          { 
           "work": "[email protected]", 
           "personal": "" 
          } 
         ] 
        } 
       ], 
       "emergency": [ 
        { 
         "contact": [ 
          { 
           "name": "-", 
           "relationship": "", 
           "telephone": [ 
            { 
             "work": "", 
             "home": "", 
             "mobile": "" 
            } 
           ] 
          } 
         ], 
         "blood_group": "" 
        } 
       ], 
       "categorization": [ 
        { 
         "designation": "", 
         "department": "", 
         "location": "", 
         "joining_date": "" 
        } 
       ] 
      }, 
      { 
       "personal_info": [ 
        { 
         "first_name": "", 
         "last_name": "", 
         "employee_id": "", 
         "gender": "", 
         "marital_status": "", 
         "nationality": "", 
         "dob": "", 
         "photo": "" 
        } 
       ], 
       "contact_details": [ 
        { 
         "address": [ 
          { 
           "street": "", 
           "city": "", 
           "state": "", 
           "zip": "", 
           "country": "" 
          } 
         ], 
         "telephone": [ 
          { 
           "work": "", 
           "mobile": "", 
           "home": "" 
          } 
         ], 
         "email": [ 
          { 
           "work": "", 
           "personal": "" 
          } 
         ] 
        } 
       ], 
       "emergency": [ 
        { 
         "contact": [ 
          { 
           "name": "", 
           "relationship": "", 
           "telephone": [ 
            { 
             "work": "", 
             "home": "", 
             "mobile": "" 
            } 
           ] 
          } 
         ], 
         "blood_group": "" 
        } 
       ], 
       "categorization": [ 
        { 
         "designation": "", 
         "department": "", 
         "location": "", 
         "joining_date": "" 
        } 
       ] 
      } 
     ], 
     "messages": [ 
      { 
       "sender": "Archer<[email protected]>", 
       "sender_role": "admin", 
       "message_type": "broadcast", 
       "message": "parking space up for grabs", 
       "message_recipients": "all", 
       "reply_permitted": "0" 
      } 
     ], 
     "events": [ 
      { 
       "creator": "Travis<[email protected]>", 
       "event_title": "", 
       "event_description": "", 
       "event_time_start": "", 
       "event_time_end": "", 
       "location": "", 
       "invitees": [ 
        { 
         "id": "020", 
         "acceptance": "1" 
        } 
       ] 
      } 
     ], 
     "settings": [ 
      { 
       "sync_frequency": "0" 
      } 
     ] 
    } 
]} 

이것은 유효한 json 형식입니다. http://jsonlint.com/으로 확인한 후 http://braincast.nl/samples/jsoneditor/

구조체를 참조하십시오. 구조체에 따르면 people 태그는 2 개의 객체를 가지므로 2의 개수를 반환해야하지만 구문 분석 중에는 1 개만 반환됩니다. 나는 옵션을 완전히 벗어났다. 제발 도와주세요.

이것은 당신의 객체 모두가 배열에 싸여 있다고는 할 수

NSString *textPAth = [[NSBundle mainBundle] pathForResource:@"sync" ofType:@"json"]; 
NSError *error; 
NSString *content = [NSString stringWithContentsOfFile:textPAth encoding:NSUTF8StringEncoding error:&error];  
NSArray *jsonArray = [[content JSONValue] retain]; 
NSLog(@"JSON ARRAY %@ AND COUNT %d",[[jsonArray valueForKey:@"updates"] valueForKey:@"people"],[[[jsonArray valueForKey:@"updates"] valueForKey:@"people"] count]); 

답변

2

는 잘 모르겠지만, 당신이 그것을 구문 분석 할 경우는 다음과 같이 싶어 :

NSDictionary *jsonDict = [[content JSONValue] retain]; 
NSArray *updatesArray = [jsonDict objectForKey:@"updates"]; 
NSDictionary *updatesDict = [updatesArray objectAtIndex:0]; 
NSArray *peopleArray = [updatesDict objectForKey:@"people"]; 
NSLog(@"People count: %i", [peopleArray count]); 
for (NSDictionary *peopleDict in peopleArray) { 
    //do something 
} 

을 보조 노트로 이것이 JSON 인 경우 실제로 배열이 아닌 항목에 대해 [arrays]를 제거해야합니다. 여전히 구문 분석 할 수는 있지만 먼저 배열을 읽은 다음 objectAtIndex : 0에서 사전을 가져와야합니다. 이는 완전히 비효율적이며 무의미합니다.

+1

+1 정답이어야합니다. 한 쪽 메모. JSON 데이터를 파싱하고 배열을 예상 할 때 JSON 렌더링 (일반적으로 서버 측)에 따라 불쾌한 결과를 얻을 수 있습니다. 실제로 JSON 렌더러가 하나의 객체를 객체로 포함하고 배열로 전달하지 않는 것은 사실입니다. 예를 들어 [PHP의 json_encode] (http://www.php.net/manual/en/function.json-encode.php)를 참조하십시오. – Till

+0

좋은 지적. 나는 단지 특정 예제 (오류 검사/방어 코드 없음)에 대한 빠르고 간단한 파싱을 제공했습니다. – Joel

+0

감사합니다. Joel. 완벽하게 작동합니다. 나는 Till과 완전히 동의한다. – arindam

0

을 분석하고 예기치 않은 결과를주는 내가 사용하고있는 코드는? 모든 사전이 단 1 개 항목 (필요)가 배열로 포장 이유

관련 문제