2011-08-30 6 views
1

Je suis en train d'analyser une sortie JSON imbriqué comme celui-ci dans l'objectif C:Comment analyser cette sortie JSON imbriquée dans Objective C?

{ 
-Status: { 
code: 200 
request: "geocode" 
name: "1.304044,103.833867" 
} 
-Placemark: [ 
-{ 
-Point: { 
-coordinates: [ 
103.834 
1.30396 
0 
] 
} 
-AddressDetails: { 
-Country: { 
CountryName: "Singapore" 
-Thoroughfare: { 
ThoroughfareName: "Bus stop at Lucky Plaza (09048)" 
} 
CountryNameCode: "SG" 
} 
Accuracy: 9 
} 
id: "p1" 
address: "Bus stop at Lucky Plaza (09048)" 
} 
-{ 
-Point: { 
-coordinates: [ 
103.834 
1.30444 
0 
] 
} 
-AddressDetails: { 
-Country: { 
CountryName: "Singapore" 
AddressLine: "Lucky Plaza" 
-Thoroughfare: { 
-PostalCode: { 
PostalCodeNumber: "238863" 
} 
ThoroughfareName: "304 Orchard Road" 
} 
CountryNameCode: "SG" 
} 
Accuracy: 9 
} 
id: "p2" 
address: "Lucky Plaza, 304 Orchard Road, Singapore 238863" 
} 
-{ 
-Point: { 
-coordinates: [ 
103.833 
1.30376 
0 
] 
} 
-AddressDetails: { 
-Country: { 
CountryName: "Singapore" 
AddressLine: "Wisma Atria" 
-Thoroughfare: { 
-PostalCode: { 
PostalCodeNumber: "238877" 
} 
ThoroughfareName: "435 Orchard Road" 
} 
CountryNameCode: "SG" 
} 
Accuracy: 9 
} 
id: "p3" 
address: "Wisma Atria, 435 Orchard Road, Singapore 238877" 
} 
-{ 
-Point: { 
-coordinates: [ 
103.835 
1.30389 
0 
] 
} 
-AddressDetails: { 
-Country: { 
CountryName: "Singapore" 
-Thoroughfare: { 
-PostalCode: { 
PostalCodeNumber: "238860" 
} 
ThoroughfareName: "291 Orchard Road" 
} 
CountryNameCode: "SG" 
} 
Accuracy: 9 
} 
id: "p4" 
address: "291 Orchard Road, Singapore 238860" 
} 
-{ 
-Point: { 
-coordinates: [ 
103.834 
1.30491 
0 
] 
} 
-AddressDetails: { 
-Country: { 
CountryName: "Singapore" 
AddressLine: "Kimsia Park" 
-Thoroughfare: { 
-PostalCode: { 
PostalCodeNumber: "228968" 
} 
ThoroughfareName: "1 Jalan Kayu Manis" 
} 
CountryNameCode: "SG" 
} 
Accuracy: 9 
} 
id: "p5" 
address: "Kimsia Park, 1 Jalan Kayu Manis, Singapore 228968" 
} 
] 
} 

J'ai un code de travail, mais je trouve la nature imbriquée de cela est assez difficile à comprendre. Ce que je voudrais sortir est un tableau/dictionnaire qui contient les éléments suivants pour chaque enregistrement de retour: coordonnées, CountryName, ThoroughfareName, PostalCode et Précision.

Voici mon code de test à ce jour:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    NSURL *jsonURL = [NSURL URLWithString:@"http://gothere.sg/maps/geo?output=json&ll=1.304044%2C103.833867&client=&sensor=false&callback="]; 

    NSString *jsonData = [[NSString alloc] initWithContentsOfURL:jsonURL]; 

    self.jsonArray = [jsonData JSONValue]; 

    NSLog(@"%@", jsonArray); 

    [jsonURL release]; 
    [jsonData release]; 
} 

Mon code gère juste pour obtenir la sortie JSON brute, toute pensée/code pour le décomposer comme je l'ai mentionné ci-dessus.

Merci!

Comme demandé, quelques informations supplémentaires.

  1. Utilisation de l'infrastructure SBJson.
  2. sortie NSLog d'en haut:

    2011-08-30 16:44:32.605 Taxi[53070:207] { 
    Placemark =  (
          { 
         AddressDetails =    { 
          Accuracy = 9; 
          Country =     { 
           CountryName = Singapore; 
           CountryNameCode = SG; 
           Thoroughfare =      { 
            ThoroughfareName = "Bus stop at Lucky Plaza (09048)"; 
           }; 
          }; 
         }; 
         Point =    { 
          coordinates =     (
           "103.834", 
           "1.30396", 
           0 
          ); 
         }; 
         address = "Bus stop at Lucky Plaza (09048)"; 
         id = p1; 
        }, 
          { 
         AddressDetails =    { 
          Accuracy = 9; 
          Country =     { 
           AddressLine = "Lucky Plaza"; 
           CountryName = Singapore; 
           CountryNameCode = SG; 
           Thoroughfare =      { 
            PostalCode =       { 
             PostalCodeNumber = 238863; 
            }; 
            ThoroughfareName = "304 Orchard Road"; 
           }; 
          }; 
         }; 
         Point =    { 
          coordinates =     (
           "103.834", 
           "1.30444", 
           0 
          ); 
         }; 
         address = "Lucky Plaza, 304 Orchard Road, Singapore 238863"; 
         id = p2; 
        }, 
          { 
         AddressDetails =    { 
          Accuracy = 9; 
          Country =     { 
           AddressLine = "Wisma Atria"; 
           CountryName = Singapore; 
           CountryNameCode = SG; 
           Thoroughfare =      { 
            PostalCode =       { 
             PostalCodeNumber = 238877; 
            }; 
            ThoroughfareName = "435 Orchard Road"; 
           }; 
          }; 
         }; 
         Point =    { 
          coordinates =     (
           "103.833", 
           "1.30376", 
           0 
          ); 
         }; 
         address = "Wisma Atria, 435 Orchard Road, Singapore 238877"; 
         id = p3; 
        }, 
          { 
         AddressDetails =    { 
          Accuracy = 9; 
          Country =     { 
           CountryName = Singapore; 
           CountryNameCode = SG; 
           Thoroughfare =      { 
            PostalCode =       { 
             PostalCodeNumber = 238860; 
            }; 
            ThoroughfareName = "291 Orchard Road"; 
           }; 
          }; 
         }; 
         Point =    { 
          coordinates =     (
           "103.83499999999999", 
           "1.30389", 
           0 
          ); 
         }; 
         address = "291 Orchard Road, Singapore 238860"; 
         id = p4; 
        }, 
          { 
         AddressDetails =    { 
          Accuracy = 9; 
          Country =     { 
           AddressLine = "Kimsia Park"; 
           CountryName = Singapore; 
           CountryNameCode = SG; 
           Thoroughfare =      { 
            PostalCode =       { 
             PostalCodeNumber = 228968; 
            }; 
            ThoroughfareName = "1 Jalan Kayu Manis"; 
           }; 
          }; 
         }; 
         Point =    { 
          coordinates =     (
           "103.834", 
           "1.30491", 
           0 
          ); 
         }; 
         address = "Kimsia Park, 1 Jalan Kayu Manis, Singapore 228968"; 
         id = p5; 
        } 
    ); 
    Status =  { 
        code = 200; 
        name = "1.304044,103.833867"; 
        request = geocode; 
    }; 
    

    }

+0

poste ur NSLog sortie de réponse JSON ici –

+0

aussi quel cadre êtes-vous utiliser pour analyser votre JSON? Avez-vous essayé JSONLint pour voir si le JSON valide? – Devraj

+1

vous pouvez obtenir tous les dictionnaires à partir des données JSON dans un tableau, puis utiliser la méthode valueForKey pour récupérer countryName, Thouroughfare nom etc .... – booleanBoy

Répondre

3

Essayez ceci:

//NSMutableArray *addressDetails = [[NSMutableArray alloc] init]; 
NSMutableArray *addressDetails = [[jsonArray valueForKey:@"Placemark"] valueForKey:@"AddressDetails"]; 

    //NSMutableArray *point = [[NSMutableArray alloc] init]; 
NSMutableArray *point = [[jsonArray valueForKey:@"Placemark"] valueForKey:@"Point"]; 

NSLog(@"%@", point); 
NSLog(@"%@", [point objectAtIndex:0]); 

NSLog(@"%@", addressDetails); 

Comme sage, vous pouvez obtenir tableau de "id" et la valeur "adresse" aussi.

Pour obtenir la valeur de "coordonnées" du réseau de points, faire

NSLog(@"%@", [[point objectAtIndex:0] valueForKey:@"coordinates"]); 

Pour addressdetails/Pays/CountryName:

NSLog(@"%@", [[[addressDetails objectAtIndex:0] valueForKey:@"Country"] valueForKey:@"CountryName"]); 
+0

Excellent! Merci. Certainement semble faire ce dont j'ai besoin :) – MrDB

+1

@spaleja: Où seront les tableaux 'addressDetails' et' point' être libéré? Ce code fuit la mémoire. –

+1

vous pouvez libérer addressDetails et tableau de points, une fois que vous obtiendrez tableau multidimensionnel du dictionnaire. – spaleja

0

Votre JSON est invalide, essayez de le tester sur http://jsonviewer.stack.hu/ une fois becames valide alors seulement vous pouvez l'utiliser. Vous devez avoir utilisé le framework SBJSON pour l'analyser.

+0

Apparaît valide pour moi, voir ici: http://jsonviewer.stack.hu/#http://gothere.sg/maps/geo?output=json&ll=1.304044%2C103.833867&client=&sensor=false&callback= – MrDB