Invalid touchJSON string
I get an invalid JSON string, which contains ; ( characters. Any guess what is going on?
My Code:
-(void)getJSONFeed {
// Create the URL & Request
NSURL *feedURL = [NSURL URLWithString:
@"http://maps.googleapis.com/maps/api/geocode/json? address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&sensor=true"];
NSURLRequest *request = [NSURLRequest requestWithURL:feedURL];
// Example connection only. Add Timeouts, cachingPolicy in production
[NSURLConnection connectionWithRequest:request delegate:self ];
// init the jsonData Property
jsonData = [[NSMutableData data] retain];
}
// NSURLConnection Delegate Methods. You would want to include more for error handling //
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSMutableData *)data {
NSLog(@"Recieving Data...");
// Append the incomming data as it is received
[jsonData appendData:data];
NSLog(@"%@",jsonData);
}
-(NSDictionary *)parseJSON:(NSMutableData *)data {
NSLog(@"Parsing JSON");
NSError *error = nil;
NSDictionary *dictionary = [[CJSONDeserializer deserializer] deserializeAsDictionary:data error:&error];
return dictionary;
}
// Parse JSON results with TouchJSON. It converts it into a dictionary.
-(void)connectionDidFinishLoading:(NSURLConnection *)connection {
NSLog(@"Fininshed Loading...");
NSDictionary * feedDictionary = [self parseJSON:jsonData];
NSLog(@"JSON as NSDictionary: %@", feedDictionary);
}
{
results = (
{
"address_components" = (
{
"long_name" = 1600;
"short_name" = 1600;
types = (
"street_number"
);
},
{
"long_name" = "Amphitheatre Pkwy";
"short_name" = "Amphitheatre Pkwy";
types = (
route
);
},
{
"long_name" = "Mountain View";
"short_name" = "Mountain View";
types = (
locality,
political
);
},
{
"long_name" = "San Jose";
"short_name" = "San Jose";
types = (
"administrative_area_level_3",
political
);
},
{
"long_name" = "Santa Clara";
"short_name" = "Santa Clara";
types = (
"administrative_area_level_2",
political
);
},
{
"long_name" = California;
"short_name" = CA;
types = (
"administrative_area_level_1",
political
);
},
{
"long_name" = "United States";
"short_name" = US;
types = (
country,
political
);
},
{
"long_name" = 94043;
"short_name" = 94043;
types = (
"postal_code"
);
}
);
"formatted_address" = "1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA";
geometry = {
location = {
lat = "37.422782";
lng = "-122.085099";
};
"location_type" = ROOFTOP;
viewport = {
northeast = {
lat = "37.4259296";
lng = "-122.0819514";
};
southwest = {
lat = "37.4196344";
lng = "-122.0882466";
};
};
};
types = (
"street_address"
);
}
);
status = OK;
}
UPDATE:
Some开发者_JAVA技巧how it interprets it as a Property list. The format seems to be similar to the original NeXTSTEP format with = ;
I'm not 100% sure what the question is. You do a valid HTTP connection, which makes a meaningful request from Google (if you delete the six spaces in the middle that are almost certainly a result of the code copy and paste to here). You accumulate the result. In the given code you appear to leak the object jsonData, but I assume that's irrelevant to the question.
You use the CJSONDeserializer object which I've not heard of but seems to be commonly mentioned on Google so is probably trustworthy. It returns a valid NSDictionary. You print the dictionary and it has the correct results in it.
Is the confusion just that when you print the dictionary to the console, it doesn't look identical to the JSON you received? If so then that's because it no longer has any concept that it came from JSON and Cocoa predates the JSON standard and hence doesn't use it for logging.
In any case, feedDictionary is a valid dictionary. The following:
NSLog(@"%@", [feedDictionary objectForKey:@"status"]);
Would print the string 'OK'. This:
NSArray *addressComponents = [feedDictionary objectForKey:@"address_components"];
for(NSDictionary *component in addressComponents)
{
NSLog(@"%@", [component objectForKey:@"long_name"]);
}
Would print the strings '1600', 'Amphitheatre Pkwy', 'Mountain View', 'San Jose', 'Santa Clara', 'California', 'United States', '94043' in that order.
If you want to print the raw JSON to the console, you probably want something like this (assuming the result comes back as UTF8):
-(void)connectionDidFinishLoading:(NSURLConnection *)connection {
NSLog(@"Fininshed Loading...");
NSString *feedString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
NSLog(@"JSON was: %@", feedString);
[feedString release];
/*NSDictionary * feedDictionary = [self parseJSON:jsonData];
NSLog(@"JSON as NSDictionary: %@", feedDictionary); */
}
Though then you'll still need to parse it to a dictionary to get meaningful results from it.
精彩评论