Reading JSON from URL and adding MKAnnotations

一笑奈何 提交于 2019-12-23 22:51:31

问题


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

回答1:


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
}



回答2:


I have an open source project on GitHub that uses the serializer with the NSCoding protocol so you can automatically create instances right from the JSON stream.

It's here.



来源:https://stackoverflow.com/questions/14864825/reading-json-from-url-and-adding-mkannotations

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!