I've read the documentation, tutorials, and other Stack Q&A and am hung up on how I'm able to get my JSON to appear using NSUTF8StringEncoding, but not using NSJSONSerialization - which is what I need to extract the data to a NSDictionary or NSArray. I believe it is an issue with the format of the NSData being returned from my URL?

EDIT Here is error: Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (Garbage at end.) UserInfo=0x8aabc30

NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.sampleURL.com"]
                                          cachePolicy:NSURLRequestUseProtocolCachePolicy
                                      timeoutInterval:15.0];

NSMutableData* responseData = [NSMutableData dataWithCapacity: 0];

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {

    //this works, and have NSLog below
    responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"string %@", responseString);

    [responseData appendData:data];
    responseData = [[NSMutableData alloc] initWithData:data];

     //this is null in NSLog
    NSError * error;
    NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:data   options:NSJSONReadingMutableContainers|NSJSONReadingAllowFragments error:&error];

    NSLog(@"jsonDict dict %@",jsonDict); 
}

Debug Console:

 2014-03-11 07:41:58.233 WBPC[7845:a0b] string   {"id":"a1","session":"General","name":"Exhibitor Setup Begins","startTime":"0900","details":"9am Exhibitor Hall","png":"image","speaker1":"Johnson","speaker2":"Nelson","speaker3":""}{"id":"b1","session":"General","name":"Conference Registration","startTime":"1000","details":"10am Noon Upper Level Lobby","png":"image","speaker1":"Jackson","speaker2":"","speaker3":""}
 2014-03-11 07:41:58.236 WBPC[7845:a0b] jsonDict (null)
有帮助吗?

解决方案 2

Your JSON is not well formed. You tell us that it is (white space and line breaks added for legibility purposes):

{
    "id": "a1",
    "session": "General",
    "name": "Exhibitor Setup Begins",
    "startTime": "0900",
    "details": "9am Exhibitor Hall",
    "png": "image",
    "speaker1": "Johnson",
    "speaker2": "Nelson",
    "speaker3": ""
}{
    "id": "b1",
    "session": "General",
    "name": "Conference Registration",
    "startTime": "1000",
    "details": "10am Noon Upper Level Lobby",
    "png": "image",
    "speaker1": "Jackson",
    "speaker2": "",
    "speaker3": ""
}

That's missing a comma between the two dictionary entries, and you're missing the [ and ] that should wrap the JSON. If it's really an array of dictionary entries, it should be:

[
    {
        "id": "a1",
        "session": "General",
        "name": "Exhibitor Setup Begins",
        "startTime": "0900",
        "details": "9am Exhibitor Hall",
        "png": "image",
        "speaker1": "Johnson",
        "speaker2": "Nelson",
        "speaker3": ""
    },
    {
        "id": "b1",
        "session": "General",
        "name": "Conference Registration",
        "startTime": "1000",
        "details": "10am Noon Upper Level Lobby",
        "png": "image",
        "speaker1": "Jackson",
        "speaker2": "",
        "speaker3": ""
    }
]

If you want to check your JSON, you can visit http://jsonlint.com. Also, if you checked the error object returned by JSONObjectWithData, it would have pointed you in the right direction.

You should look how this JSON was generated. It looks like it must have been manually generated. If you were generating this from a PHP page, for example, you should use json_encode, for example, rather than manually generating the JSON.


By the way, you are trying to parse the result in didReceiveData. You shouldn't try to parse until connectionDidFinishLoading. Your didReceiveData should merely append the data to your NSMutableData object. The parsing should be deferred until connectionDidFinishLoading.

其他提示

You're doing it all in the 'didReceiveData' delegate function which isn't the correct place. The only thing that should be there is:

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    [self.responseData appendData:data];
}

but before this, you should initialise the 'self.responseData' when the connection receives a response:

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    if(self.responseData != nil) self.responseData = nil;
    self.responseData = [[NSMutableData alloc] init];
}

and then, you need to implement another delegate function called 'connectionDidFinishLoading' and when this method is called, your 'responseData' will contain all of the data from the JSON and will be ready to parse:

-(void)connectionDidFinishLoading:(NSURLConnection *)connection {

     responseString = [[NSString alloc] initWithData:self.responseData encoding:NSUTF8StringEncoding];

     NSLog(@"string %@", responseString);

     NSError * error;
     NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers|NSJSONReadingAllowFragments error:&error];

     NSLog(@"jsonDict dict %@",jsonDict); 
}

I hope that helps in some way.

Hi you can try this one.

NSError *error = nil;
NSArray *jsonResponseArray = [NSJSONSerialization JSONObjectWithData: YOURDATA options: NSJSONReadingMutableContainers error: &error];

if (!jsonResponseArray) {
  NSLog(@"Error: %@", error);
} else {
   for(NSDictionary *dic in jsonResponseArray) {
      NSLog(@"dic values are : %@", item);
   }
}

Thanks

The JSON string you have posted is not valid JSON. Just because the data is a valid UTF8 string doesn't mean it is necessarily JSON. Try pasting the string from your debugged into JSONLint and it will show you that you're missing a comma between your JSON objects.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top