尝试在 Xcode NSCocoaErrorDomain Code=3840 中解析 JSON

Posted

技术标签:

【中文标题】尝试在 Xcode NSCocoaErrorDomain Code=3840 中解析 JSON【英文标题】:Trying to parse JSON in Xcode NSCocoaErrorDomain Code=3840 【发布时间】:2013-11-26 06:07:55 【问题描述】:

我一直在像这样在 Xcode 中解析 JSON:

-(void)getCheckUserData:(NSData *)data 

NSError *error;
if (!error) 

checkUserJSON = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];

else
    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Uh Oh" message:@"Spaghetti-O" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
    [alert show];





-(void) startCheckingUserLogin 

NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:kCheck_user]
                                          cachePolicy:NSURLRequestUseProtocolCachePolicy
                                      timeoutInterval:20.0];

NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest
                                                               delegate:self];
if (theConnection) 
    NSURL *url = [NSURL URLWithString:kCheck_user];
    NSData *data = [NSData dataWithContentsOfURL:url];
    [self getCheckUserData:data];
  


但是我聘请了一位网络开发人员,他更新了我过时的 php 文件,这些文件从 phpmyadmin 获取数据并将其编码为 JSON。现在我在 xcode 中收到 NSCocoaErrorDomain Code=3840 消息。

这是我从中获取数据的 php 文件:

 <?php 

 require_once( 'classes/secure.php' );
 $SECURE = new Secure();

 if( !isset( $_POST[ 'var1' ] ) )  exit("ERROR: no var1"); 
 if( !isset( $_POST[ 'var2' ] ) )  exit("ERROR: no var2"); 

 $VARONE = $_POST[ 'var1' ];
 $VARTWO  = $_POST[ 'var2' ];

 $RESULT = $SECURE->checkPassword( $VARONE, $VARTWO ); // Check VARONE / VARTWO
 unset( $SECURE ); // Unset Secure
 exit( json_encode( $RESULT ) ); // Return result as JSON string

 ?>

我需要改变什么?

【问题讨论】:

您能否手动执行对网络服务的请求(即不通过应用程序)并编辑您的帖子以包含结果?换句话说,你确定你的 json 是合法的吗? 【参考方案1】:

问题在于编码。我有一项 Web 服务在 99% 的时间里都可以正常工作,但是对一个带有某些参数的端点的响应失败了。我在 RESTClient 中运行了请求,并在标头中注意到响应是 ISO-8859-1,也就是 Latin-1。

诀窍是将 Latin-1 数据转换为 NSString,然后使用 NSString 转换回 UTF8 数据以使 NSJSONSerialization 快乐。

NSError *error;
NSArray *json = [NSJSONSerialization JSONObjectWithData:self->receivedData options:0 error:&error];
if (!json && error && [error.domain isEqualToString:NSCocoaErrorDomain] && (error.code == NSPropertyListReadCorruptError)) 
    // Encoding issue, try Latin-1
   NSString *jsonString = [[NSString alloc] initWithData:self->receivedData encoding:NSISOLatin1StringEncoding];
   if (jsonString) 
        // Need to re-encode as UTF8 to parse, thanks Apple
        json = [NSJSONSerialization JSONObjectWithData:
                [jsonString dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES]
            options:0 error:&error];
    

我确信市面上有很多很棒的 REST 工具,您可能想看看其中的一些。 RESTClient 是 Firefox 的插件。

【讨论】:

只是说:如果服务器发送的内容应该是 ISO-8859-1 中的 JSON,那么它不是有效的 JSON,服务器就坏了。 JSON 是 UTF-8、UTF-16 或 UTF-32。没有别的了。

以上是关于尝试在 Xcode NSCocoaErrorDomain Code=3840 中解析 JSON的主要内容,如果未能解决你的问题,请参考以下文章

iOS-----Xcode-Debug尝试

尝试在 vmware MAC High Sierra 上的 xcode 9.2 中打开游戏场景,但 xcode 意外关闭

Xcode 11 beta 模拟器在尝试加载 AudioToolbox 时崩溃

尝试在 iOS 上使用 Restkit - XCode

尝试在 Xcode 上运行时 PJSIP 出错

尝试归档 Xcode 项目时出错