Iphone Objective-C中带有SBJson的输入意外结束

Iphone Objective-C中带有SBJson的输入意外结束,iphone,objective-c,json,json-framework,sbjson,Iphone,Objective C,Json,Json Framework,Sbjson,我有以下代码试图解析我从网站返回的JSON: - (void)connectionDidFinishLoading:(NSURLConnection *)connection { [connection release]; NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; NSLog(@"my ns str

我有以下代码试图解析我从网站返回的JSON:

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

     [connection release];

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

     NSLog(@"my ns string = %@", responseString);

     [responseData release];

     NSError *error; 
     NSDictionary *dictionary = [parser objectWithString:responseString   
                                               error:&error]; 
     while (error) { 
         NSLog(@"%@", error); 
         error = [[error userInfo] objectForKey:NSUnderlyingErrorKey]; 
     } 

     NSLog(@"%@", dictionary);


 }
我发现以下错误:

2011-08-01 20:16:47.273 myJSONParser[1040:b603] Connection didReceiveResponse: 
<NSHTTPURLResponse: 0x4e810f0> - application/json
2011-08-01 20:16:47.279 myJSONParser[1040:b603] Connection didReceiveData of length: 117
2011-08-01 20:16:47.359 myJSONParser[1040:b603] my ns string = 
2011-08-01 20:16:47.361 myJSONParser[1040:b603] Error Domain=org.brautaset.SBJsonParser.ErrorDomain Code=0 "Unexpected end of input" UserInfo=0x4eada30 {NSLocalizedDescription=Unexpected end of input}
2011-08-01 20:16:47.363 myJSONParser[1040:b603] (null)
“输入的意外结束”让我相信JSON的格式有点不正确,但JSONLint告诉我它完全有效。我做错了什么?感谢您花时间阅读本文,如有任何建议,我们将不胜感激

更新:

我将响应数据设置为:

header("Content-Type:application/json");
...
echo json_encode($arr);
NSMutableData *responseData;

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
         NSLog(@"Connection didReceiveData of length: %u", data.length);

         [responseData appendData:data];

     }
解析器如下所示(in.h):

m:

parser = [[SBJsonParser alloc] init];
调查结果:

HTTP/1.1 200 OK
Date: Tue, 02 Aug 2011 03:30:14 GMT
Server: Apache
X-Powered-By: PHP/5.2.15
Transfer-Encoding: chunked
Content-Type: application/json

[{"key1":"Name","key2":"First","key3":"2011-08-13"},{"key1":"Second","key2":"test2","key3":"2011-08-13"}]
收到的数据说明:

数据的打印说明:{length= 117,容量=256,字节=0x5b7b22686f6d65223a22426c61636b62。。。 30382D313327D5D}

从中,似乎只有在找到EOF令牌时,我们才会得到“意外的输入结束”

SBJsonParser.m:

case SBJsonStreamParserWaitingForData:
            self.error = @"Unexpected end of input";
            break;
SBJsonStreamParserState.m:

- (SBJsonStreamParserStatus)parserShouldReturn:(SBJsonStreamParser*)parser {
    return SBJsonStreamParserWaitingForData;
}
SBJsonStreamParser.m:

    switch (tok) {
        case sbjson_token_eof:
            return [state parserShouldReturn:self];
            break;
    ... }
您的日志似乎表明NSString有问题。我将检查响应数据以确保其正确性——您可以使用诸如Fiddler或Charles之类的代理、xcode调试器或简单的旧NSLog()来执行此操作

编辑:

好的,我将调试器中的数据转换为UTF-8,这是我得到的:

[{"home":"Blackb ... 08-13"}]
您只粘贴了字节数组的一部分,因此省略号所在的位置应该更多。“家”或“黑”对你有什么意义吗?在Charles截获的响应数据中没有任何地方。您是否在DidReceiveSense委托方法中的responseData上执行setLength:0?从中,我们似乎只在找到EOF令牌时获得“意外输入结束”

SBJsonParser.m:

case SBJsonStreamParserWaitingForData:
            self.error = @"Unexpected end of input";
            break;
SBJsonStreamParserState.m:

- (SBJsonStreamParserStatus)parserShouldReturn:(SBJsonStreamParser*)parser {
    return SBJsonStreamParserWaitingForData;
}
SBJsonStreamParser.m:

    switch (tok) {
        case sbjson_token_eof:
            return [state parserShouldReturn:self];
            break;
    ... }
您的日志似乎表明NSString有问题。我将检查响应数据以确保其正确性——您可以使用诸如Fiddler或Charles之类的代理、xcode调试器或简单的旧NSLog()来执行此操作

编辑:

好的,我将调试器中的数据转换为UTF-8,这是我得到的:

[{"home":"Blackb ... 08-13"}]

您只粘贴了字节数组的一部分,因此省略号所在的位置应该更多。“家”或“黑”对你有什么意义吗?在Charles截获的响应数据中没有任何地方。是否在DidReceiveSense委托方法中对responseData执行setLength:0?responseData在哪里初始化?这一点上的代码是什么?从日志输出中,字符串为空。responseData在哪里初始化?这一点上的代码是什么?从日志输出中,字符串为空。感谢您的回复,pepsi,为什么NSLog(@“Connection didReceiveData of length:%u”,data.length);打印长度117?“文件结束”标记表示响应为空,或者响应不完整,对吗?@Pete:我不知道在哪里找到eof;但是看看你的日志,这个字符串确实有问题。您确定编码正确吗?设置Fiddler/Charles并确保您收到的数据符合您的预期可能会有所帮助我感谢您的建议。我用来自的调查结果更新了这个问题Charles@Pete:传入的数据对我来说似乎有效。。我们现在已经将其缩小到NSURLConnection委托方法。你能在调试器中检查NSData字节数组,看看它是否仍然正确吗?我不太确定我在调试器中查找的是什么,我将对象的描述打印到控制台并粘贴到问题中。我看到它的大小是117,查尔斯说是1.17kb。不确定这是否是巧合,有一点是肯定的,我没有看到任何证据表明我首先收到了JSON,尽管感谢您的回复,百事可乐,为什么NSLog(@“Connection didReceiveData of length:%u”,data.length);打印长度117?“文件结束”标记表示响应为空,或者响应不完整,对吗?@Pete:我不知道在哪里找到eof;但是看看你的日志,这个字符串确实有问题。您确定编码正确吗?设置Fiddler/Charles并确保您收到的数据符合您的预期可能会有所帮助我感谢您的建议。我用来自的调查结果更新了这个问题Charles@Pete:传入的数据对我来说似乎有效。。我们现在已经将其缩小到NSURLConnection委托方法。你能在调试器中检查NSData字节数组,看看它是否仍然正确吗?我不太确定我在调试器中查找的是什么,我将对象的描述打印到控制台并粘贴到问题中。我看到它的大小是117,查尔斯说是1.17kb。不确定这是否是巧合,但有一点可以肯定,我没有看到任何证据表明我首先收到了JSON