Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Reading JSON from URL and adding MKAnnotations

I've been through several different tutorials trying to get this working, but they seem to gloss over some crucial steps that a beginner might not know.

I have a JSON file at a URL with name, latitude, and longitude listed. How can I import that to an array or dictionary (I don't know the difference), and then iterate over it and create a new annotation with each iteration.

IOS6, Storyboards

_ Added Code _

ViewController.h

#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>


@interface ViewController : UIViewController {}

@property (weak, nonatomic) IBOutlet MKMapView *mapView;

@property (nonatomic, strong) NSMutableData *downloadData;

@end

ViewController.m

#import "ViewController.h"
#import "MapViewAnnotation.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    _downloadData = [NSMutableData new];

    NSURL *requestURL = [NSURL URLWithString:@"OMITTED/apptest/locations.json"];
    NSURLRequest *request = [NSURLRequest requestWithURL:requestURL];
    NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
    [connection start];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    [_downloadData appendData:data];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    id parsed = [NSJSONSerialization JSONObjectWithData:_downloadData options:kNilOptions error:nil];
    for (NSDictionary *pointInfo in parsed)
    {
        NSLog([parsed objectForKey:@"name"]);
        double xCoord = [(NSNumber*)[parsed objectForKey:@"lat"] doubleValue];
        double yCoord = [(NSNumber*)[parsed objectForKey:@"lon"] doubleValue];
        CLLocationCoordinate2D coords = CLLocationCoordinate2DMake(xCoord, yCoord);


        MKPointAnnotation *point = [MKPointAnnotation new];
        point.coordinate = coords;
        point.title = [parsed objectForKey:@"name"];

        [self.mapView addAnnotation:point]; // or whatever your map view's variable name is
    }
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

-(void)viewDidUnload {
    [super viewDidUnload];
    // ARC Problem --- [_mapView release];
    self.mapView = nil;
}

@end
like image 525
Adama Avatar asked Feb 21 '26 07:02

Adama


1 Answers

With iOS 5 there's a JSONSerializer class that can convert the raw JSON data from your URL into an array or dictionary as appropriate.

You'll need to download the data from the server:

NSURL *requestURL = [NSURL URLWithString:@"<your url here>"];
NSURLRequest *request = [NSURLRequest requestWithURL:requestURL];
NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
[connection start];

Then you'll add these delegate methods:

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    [_downloadData appendData:data];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    id parsed = [NSJSONSerialization JSONObjectWithData:_downloadData options:kNilOptions error:nil];
}

_downloadData is an instance variable or property of your class of type NSMutableData.

That parsed variable will contain your data from the server. It's probably an array if it's a list of points, so you can iterate through it using fast enumeration:

for (NSDictionary *pointInfo in parsed) {
    double xCoord = [(NSNumber*)[parsed objectForKey:@"<key for lat coord>"] doubleValue];
    double yCoord = [(NSNumber*)[parsed objectForKey:@"<key for long coord>"] doubleValue];
    CLLocationCoordinate2D coords = CLLocationCoordinate2DMake(xCoord, yCoord);


    MKPointAnnotation *point = [[MKPointAnnotation new] autorelease];
    point.coordinate = coords;        
    point.title = [parsed objectForKey:@"<key for title>"];  

    [self.mapView addAnnotation:point]; // or whatever your map view's variable name is
}
like image 105
Chris C Avatar answered Feb 23 '26 20:02

Chris C



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!