2012-05-02 14 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/

の構造を参照してください。構造によると、2つのオブジェクトを持っているので、peopleタグは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の場合、実際には配列ではないエントリの[配列]を削除したいと思うでしょう。あなたはまだそれを解析することができますが、配列を最初に読んでから、objectAtIndex:0から辞書を取得する必要があります。これは完全に非効率的で無意味です。

+1

+1これが正解でなければなりません。片面メモ。 JSONデータを解析して配列を期待すると、JSONのレンダリング(通常はサーバー側)に応じて、厄介な驚きを見つけることができます。そのようなJSONレンダラーが実際には配列としてではなく単一のオブジェクトをオブジェクトとして含む配列を実際に配信することは完全に有効です。たとえば、[PHPのjson_encode](http://www.php.net/manual/en/function.json-encode.php)を参照してください。 – Till

+0

良い点。私はちょうどその特定の例(エラーチェック/防御コードなし)のための迅速かつ汚れた解析を彼に与えていました。 – Joel

+0

ありがとうジョエル。それは完璧に働いています。私はTillと完全に同意しています。 – arindam

0

を解析するために使用していたコードのですか?すべての辞書が1つのだけのエントリ(不要)がある配列、でラップされている理由

関連する問題