10

I am trying to parse a json string requested from an api located at: http://www.physics.leidenuniv.nl/json/news.php

However, i am having trouble parsing this json. I get the following error: Unexpected end of file during string parse

I have looked for hours, but I can not find an answer to this problem.

My code snippet:

In my viewDidLoad:

NSURLRequest *request = [NSURLRequest requestWithURL:
                         [NSURL URLWithString:@"http://www.physics.leidenuniv.nl/json/news.php"]];

[[NSURLConnection alloc] initWithRequest:request delegate:self];

The delegate:

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
NSMutableData *responseData = [[NSMutableData alloc] init];
[responseData appendData:data];

NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
NSError *e = nil;
NSData *jsonData = [responseString dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *JSON = [NSJSONSerialization JSONObjectWithData:jsonData options: NSJSONReadingMutableContainers error: &e];
}

Anybody know an answer to this problem so i can parse the json data?

3
  • 3
    didReceiveData being invoked does not mean that ALL data has been received -- there may be more yet to come. Commented Nov 19, 2013 at 16:54
  • Indeed, the didReceiveData method will be called several times with a chunk of your total data. You have to instantiate a NSData and paste the chunks in it one after another. Commented Nov 19, 2013 at 16:55
  • Try AFNetworking Commented Nov 19, 2013 at 17:33

7 Answers 7

34

I would recommend doing it this way:

NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.physics.leidenuniv.nl/json/news.php"]];

__block NSDictionary *json;
[NSURLConnection sendAsynchronousRequest:request
                                   queue:[NSOperationQueue mainQueue]
                       completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
                           json = [NSJSONSerialization JSONObjectWithData:data
                                                                  options:0
                                                                    error:nil];
                           NSLog(@"Async JSON: %@", json);
                       }];

Or if for whatever reason (not recommended) you want to run a synchronous request you could do:

NSData *theData = [NSURLConnection sendSynchronousRequest:request
                      returningResponse:nil
                                  error:nil];

NSDictionary *newJSON = [NSJSONSerialization JSONObjectWithData:theData
                                                        options:0
                                                          error:nil];

NSLog(@"Sync JSON: %@", newJSON);
Sign up to request clarification or add additional context in comments.

Comments

9

Do this way:

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    // Append the new data to receivedData.
    // receivedData is an instance variable declared elsewhere.

    [responseData appendData:data];
}


- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
NSError *e = nil;
NSData *jsonData = [responseString dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *JSON = [NSJSONSerialization JSONObjectWithData:jsonData options: NSJSONReadingMutableContainers error: &e];

}

Comments

1
//call this method
-(void)syncWebByGETMethod
{
      [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
    NSString *urlString = [NSString stringWithFormat:@"http://www.yoursite.com"];
    NSURLRequest * request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]];
   [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue]                          completionHandler:^(NSURLResponse * response, NSData * data, NSError * connectionError)
        {
         if (data)
         {
             id myJSON;
             @try {
                 myJSON = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
             }
             @catch (NSException *exception) {
             }
             @finally {
             }
             jsonArray = (NSArray *)myJSON;

             NSLog(@"mmm %@",jsonArray);
         }
     }];
}

Comments

1

Simple Way to store json-url data in dictionary.

 NSData *data=[NSData dataWithContentsOfURL:[NSURL URLWithString:@"https://query.yahooapis.com/v1/public/yql?q=select+%2A+from+weather.forecast+where+woeid%3D1100661&format=json"]];
    NSError *error=nil;
    id response=[NSJSONSerialization JSONObjectWithData:data options:
                 NSJSONReadingMutableContainers | NSJSONReadingMutableLeaves error:&error];

    if (error) {
        NSLog(@"%@",[error localizedDescription]);
    } else {
        _query = [response objectForKey:@"query"];
        NSLog(@"%@",_query); 

You can try this, so easy.

Comments

0

One solution is to use NSURLConnection sendSynchronousRequest:returningResponse:error: (docs). In the completion handler you'll have ALL the response data, not just the partial data you get in the delegate's connection:didReceiveData: method.

If you want to keep using the delegate, you'll need to follow the advice in the Apple docs:

The delegate should concatenate the contents of each data object delivered to build up the complete data for a URL load.

Comments

0

Volunteermatch API Objective C

i am using one common methods for AFNetworking WS Calling. Uses:

Call WS:

NSDictionary* param = @{
                        @"action":@"helloWorld",
                        @"query":@"{\"name\":\"john\"}"
                        };

[self requestWithUrlString:@"URL" parmeters:paramDictionary success:^(NSDictionary *response) {
    //code For Success
} failure:^(NSError *error) {
   // code for WS Responce failure
}];

Add Two Methods: this two methods are common,u can use these common method in whole project useing NSObject class. also add // define error code like...

define kDefaultErrorCode 12345

- (void)requestWithUrlString:(NSString *)stUrl parmeters:(NSDictionary *)parameters success:(void (^)(NSDictionary *response))success failure:(void (^)(NSError *error))failure {

[self requestWithUrl:stUrl parmeters:parameters success:^(NSDictionary *response) {
    if([[response objectForKey:@"success"] boolValue]) {
        if(success) {
            success(response);
            
        }
    }
    else {
        NSError *error = [NSError errorWithDomain:@"Error" code:kDefaultErrorCode userInfo:@{NSLocalizedDescriptionKey:[response objectForKey:@"message"]}];
        if(failure) {
            failure(error);
        }
    }
} failure:^(NSError *error) {
    if(failure) {
        failure(error);
    }
}];}

and // Set Headers in Below Method (if required otherwise remove)

- (void)requestWithUrl:(NSString *)stUrl parmeters:(NSDictionary *)parameters success:(void (^)(NSDictionary *response))success failure:(void (^)(NSError *))failure {

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager setResponseSerializer:[AFHTTPResponseSerializer serializer]];


[manager.requestSerializer setValue:@"WWSE profile=\"UsernameToken\"" forHTTPHeaderField:@"Authorization"];



[manager GET:stUrl parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
    if([responseObject isKindOfClass:[NSDictionary class]]) {
        if(success) {
            success(responseObject);
        }
    }
    else {
        NSDictionary *response = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil];
        if(success) {
            success(response);
        }
    }
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
    if(failure) {
        failure(error);
    }
}];}

For any issues and more Detail please visit..AFNetworking

Comments

0
-(void)getWebServic{
NSURL *url = [NSURL URLWithString:@"----URL----"];

// 2
NSURLSessionDataTask *downloadTask = [[NSURLSession sharedSession]
                                      dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
{
    NSDictionary *jsonObject=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
    [self loadDataFromDictionary:(NSArray*)jsonObject];
    NSLog(@"data: %@",jsonObject);

}];

// 3
[downloadTask resume]; }

Comments

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.