尝试在 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的主要内容,如果未能解决你的问题,请参考以下文章
尝试在 vmware MAC High Sierra 上的 xcode 9.2 中打开游戏场景,但 xcode 意外关闭