views:

60

answers:

2

I am reading JSON data back from a server, and I am trying to parse a particular string that contains an HTML URL. The data is in an NSString called current_weatherIconUrl2. The console output from Xcode is below:

2010-07-06 17:17:46.628 WhatToDo[13437:20b] Current Condition: URL2: ( "http://www.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0001_sunny.png" )

What I tried to do is use "stringByTrimmingCharactersInSet" to parse the '(', '"', and also the line feed and newlines, but I am instead getting the NSInvalidArgumentException:

2010-06-30 00:18:07.357 WhatToDo[7299:20b] * Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '* -[NSCFArray stringByTrimmingCharactersInSet:]: unrecognized selector sent to instance 0x3e84970'

Here is an extract of the data that is returned from the server (information I want to extract is bolded):

2010-07-06 17:17:46.627 WhatToDo[13437:20b] Results: { data = { "current_condition" = ( { cloudcover = 75; humidity = 42; "observation_time" = "08:47 AM"; precipMM = "0.0"; pressure = 1003; "temp_C" = 36; "temp_F" = 97; visibility = 10; weatherCode = 113; weatherDesc = ( { value = Sunny; } ); weatherIconUrl = ( { value = "http://www.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0001_sunny.png"; } ); winddir16Point = WSW; winddirDegree = 250; windspeedKmph = 31; windspeedMiles = 19; } ); }; }

Here is the code that parses the data into NSString variables.

- (void) readWeather {
    NSLog(@"readWeather started");
    NSMutableArray *imageArray = [[NSMutableArray alloc] init];
    NSData *jsonObjectString;
    NSString *completeString = [NSString stringWithFormat:
                            @"http://www.worldweatheronline.com/feed/weather.ashx?key=988ae47cc3062016100606&lat=25.04&lon=121.55&num_of_days=5&format=json", jsonObjectString];                               

    NSLog(@"Weather URL: %@", completeString);

    NSURL *urlForValidation = [NSURL URLWithString:completeString];               
    NSMutableURLRequest *validationRequest = [[NSMutableURLRequest alloc] initWithURL:urlForValidation];                          
    [validationRequest setHTTPMethod:@"POST"];             
    NSData *responseData = [NSURLConnection sendSynchronousRequest:validationRequest returningResponse:nil error:nil];  
    [validationRequest release];

// Store incoming data into a string
NSString *jsonString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];

// Create a dictionary from the JSON string
NSDictionary *results = [jsonString JSONValue];

NSLog(@"Results: %@", results);

NSArray *data = [[results objectForKey:@"data"] objectForKey:@"current_condition"];

NSArray *data2 = [[results objectForKey:@"data"] objectForKey:@"weather"];

NSCharacterSet *skipSet = [NSCharacterSet characterSetWithCharactersInString:@"("];

for (NSArray *current_condition in data)
{
    // Get title of the image
    NSString *temp_C = [current_condition valueForKey:@"temp_C"];
    NSString *current_weatherDesc = [current_condition valueForKey:@"weatherDesc"];
    NSString *current_weatherIconUrl = [current_condition valueForKey:@"weatherIconUrl"];
    NSString *current_weatherIconUrl2= [current_weatherIconUrl valueForKey:@"value"];

    //Commented out because this will create an exception: 
    //NSString *current_weatherIconUrl3 = [current_weatherIconUrl2 stringByTrimmingCharactersInSet:skipSet];
    //NSLog(@"Current Condition: URL2: %@", *(current_weatherIconUrl3);

    //Commented out because this will create an exception: 
    //current_weatherIconUrl3 = [current_weatherIconUrl3 stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
}

Can someone tell me what I am doing wrong or if there is a better method than using 'stringByTrimmingCharactersInSet'?

Any help is appreciated!

Thank you.

+2  A: 

The error you're getting actually describes what goes wrong:

2010-06-30 00:18:07.357 WhatToDo[7299:20b] * Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '* -[NSCFArray stringByTrimmingCharactersInSet:]: unrecognized selector sent to instance 0x3e84970'

You're trying to send an unrecognized selector (stringByTrimmingCharactersInSet:) to an instance of NSCFArray (NSArray).

Obviously, this selector only exists on NSString, so this won't work.

It appears that [current_weatherIconUrl valueForKey:@"value"] really is an NSArray, not an NSString.

Douwe Maan
A: 

Thanks for your help Douwe M. I was able to make some modifications, and now the code creates the variables I need. See below...

NSArray *weatherIconUrl2= [weatherIconUrl valueForKey:@"value"];
NSString *weatherIconUrl3 = [[weatherIconUrl2 valueForKey:@"description"] componentsJoinedByString:@""];
[imageArray addObject:[UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:weatherIconUrl3]]]];

-Todd