0

when I try my own data the NSLog for "date" returns null. Here is my json from the web page:

[{"date":"2012-08-13 12:00:00","timezone_type":3,"timezone":"EST5EDT"},{"date":"2012-08-13 10:00:00","timezone_type":3,"timezone":"EST5EDT"},{"date":"2012-08-13 13:00:00","timezone_type":3,"timezone":"EST5EDT"}]

and here is my code: .m

#define kBgQueue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
//#define kLatestKivaLoansURL [NSURL          URLWithString://@"http://api.kivaws.org/v1/loans/search.json?status=fundraising"]
#define kLatestKivaLoansURL [NSURL URLWithString:@"http://www.xxxxxxxxxxx.com/appointjson.php"]

#import "MyAvailTimesViewController.h"

@interface MyAvailTimesViewController ()

@end

@implementation MyAvailTimesViewController
@synthesize json;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    //Do any additional setup after loading the view.
    dispatch_async(kBgQueue, ^{
        NSData* data = [NSData dataWithContentsOfURL: 
                        kLatestKivaLoansURL];
        [self performSelectorOnMainThread:@selector(fetchedData:) 
                               withObject:data waitUntilDone:YES];

    });
}
- (void)fetchedData:(NSData *)responseData {
    //parse out the json data
    NSLog(@"%@",responseData);
    NSError* error;
    NSDictionary* json = [NSJSONSerialization 
                          JSONObjectWithData:responseData

                          options:kNilOptions 
                          error:&error];

    NSArray* latestLoans = [json objectForKey:@"date"];
    NSLog(@"date: %@", latestLoans);
    //NSLog(@"output2: %@", json);

.h

#import <UIKit/UIKit.h>

@interface MyAvailTimesViewController : UIViewController {
}

@property(nonatomic, retain) NSDictionary *json;
@end

The NS log when i responseData is: 2012-08-15 15:17:54.114 GBSB[480:15b03] <3c21444f 43545950 45206874 6d6c2050 55424c49 4320222d 2f2f5733 432f2f44 54442058 48544d4c 20312e30 20547261 6e736974 696f6e61 6c2f2f45 4e222022 68747470 3a2f2f77 77772e77 332e6f72 672f5452 2f786874 6d6c312f 4454442f 7868746d 6c312d74 72616e73 6974696f 6e616c2e 64746422 3e0a3c68 746d6c20 786d6c6e 733d2268 7474703a 2f2f7777 772e7733 2e6f7267 2f313939 392f7868 746d6c22 3e0a3c68 6561643e 0a3c7469 746c653e 47425342 204a534f 4e204665 65643c2f 7469746c 653e0a3c 2f686561 643e0a5b 7b226461 7465223a 22323031 322d3038 2d313320 31323a30 303a3030 222c2274 696d657a 6f6e655f 74797065 223a332c 2274696d 657a6f6e 65223a22 45535435 45445422 7d2c7b22 64617465 223a2232 3031322d 30382d31 33203130 3a30303a 3030222c 2274696d 657a6f6e 655f7479 7065223a 332c2274 696d657a 6f6e6522 3a224553 54354544 54227d2c 7b226461 7465223a 22323031 322d3038 2d313320 31333a30 303a3030 222c2274 696d657a 6f6e655f 74797065 223a332c 2274696d 657a6f6e 65223a22 45535435 45445422 7d5d3c62 6f64793e 0a0a3c2f 626f6479 3e0a3c2f 68746d6c 3e>

I am having a hard time finding a resolution.

James A Mohler
  • 11,060
  • 15
  • 46
  • 72
TIDev
  • 109
  • 4
  • 10
  • Hmm... I don't think `json` should be `NSDictionary`. It looks more like `NSArray`. You can do `json.count` to verify if it's an dictionary or array. – danqing Aug 15 '12 at 23:26
  • What Tommy elaborated below is exactly what I mean. – danqing Aug 16 '12 at 00:55
  • Only problem is that I am pulling from a server. – TIDev Aug 16 '12 at 00:57
  • why is that a problem? You are doing `NSDictionary* json = [NSJSONSerialization...`. You should instead do `NSArray* json = [NSJSONSerialization...`. If what you are doing now is not a problem, then what you should do shouldn't be a problem. – danqing Aug 16 '12 at 00:59
  • i get this now 2012-08-15 18:02:04.406 GBSB[4019:15b03] Error parsing JSON: Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (JSON text did not start with array or object and option to allow fragments not set.) UserInfo=0x844cb40 {NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.} – TIDev Aug 16 '12 at 01:03
  • Tommy has pointed out that your `NSData` is not a valid JSON string. That's most likely the cause of the error. – danqing Aug 16 '12 at 01:05
  • i verified it in json validator website. – TIDev Aug 16 '12 at 01:12

1 Answers1

0

This:

[{"date":"2012-08-13 12:00:00","timezone_type":3,"timezone":"EST5EDT"},{"date":"2012-08-13 10:00:00","timezone_type":3,"timezone":"EST5EDT"},{"date":"2012-08-13 13:00:00","timezone_type":3,"timezone":"EST5EDT"}]

is an array, not a dictionary. When you perform [NSJSONSerialization JSONObjectWithData:... the returned object should be an NSArray. So when you call objectForKey: you should see an exception.

If you're getting nil then the only sensible conclusion is that the JSON data you're asking to be parsed is malformed.

Having checked the NSData you post, your server is actually returning:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>GBSB JSON Feed</title>
</head>
[{"date":"2012-08-13 12:00:00","timezone_type":3,"timezone":"EST5EDT"},{"date":"2012-08-13 10:00:00","timezone_type":3,"timezone":"EST5EDT"},{"date":"2012-08-13 13:00:00","timezone_type":3,"timezone":"EST5EDT"}]<body>

</body>
</html>

Which clearly isn't valid JSON; it's an HTML document that happens to display JSON.

Tommy
  • 99,986
  • 12
  • 185
  • 204
  • I am puling the data from a server and it will change. I don't want to hard code the json. any suggestions? Are you saying I should just have the php part and no title or any other info in the php file? – TIDev Aug 16 '12 at 00:43
  • If it were the valid JSON you seem to want, the very first characters would be `[{"date":"2012-08-13 12:` and the final characters would be `_type":3,"timezone":"EST5EDT"}]`. Assuming that's exactly what your PHP generates then, yes, just dump all the HTML stuff that it's wrapped in. – Tommy Aug 16 '12 at 01:46