1

I'm trying to parse a nested JSON output like this in 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"
}
]
}

I have some code working, but I'm finding the nested nature of this to be pretty tough to figure out. What I'd like to get out is an array/dictionary which contains the following elements for each return record: coordinates, CountryName, ThoroughfareName, PostalCode and Accuracy.

Here is my test code so far:

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

My code just manages to get the raw JSON output, any thoughts/code to break it down as I've mentioned above.

Thanks!

As requested, some further information.

  1. Using SBJson framework.
  2. NSLog output from above:

    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;
    };
    

    }

7
  • post ur nslog json response output here Commented Aug 30, 2011 at 8:30
  • Also what framework are you using to parse your JSON? Have you tried JSONLint to see if the JSON validates? Commented Aug 30, 2011 at 8:35
  • 1
    you can get all the dictionaries from the JSON data in an array and then use valueForKey method to retrieve countryName,Thouroughfare name etc.... Commented Aug 30, 2011 at 8:57
  • @booleanBoy - I've come across what you've suggested, but am uncertain how to implement... any suggestions please? Commented Aug 30, 2011 at 9:00
  • First, have u obtained the data from JSON in a dictionary ? Commented Aug 30, 2011 at 9:10

2 Answers 2

3

Try this :

//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);

Like wise you can get array of "id" and "address" value also.

To get value of "coordinates" of point array, do this

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

For AddressDetails/Country/CountryName :

NSLog(@"%@", [[[addressDetails objectAtIndex:0] valueForKey:@"Country"] valueForKey:@"CountryName"]);
Sign up to request clarification or add additional context in comments.

2 Comments

@spaleja: Where will be the arrays addressDetails and point be released? This code leaks memory.
you can release addressDetails and point array, once you will get invidual array from dictionary.
0

Your json is invalid, try to test it on http://jsonviewer.stack.hu/ once it becames valid then only you can use it. You must have used the SBJSON framework to parse it.

1 Comment

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.