我的iOS应用程序突然出现了一个非常奇怪的问题。我过去常常从服务器接收Jsons,并从中提取一些信息。除了一个用户帐户:我只得到属性的第一个字符外,一切都很完美。
例如,如果Json是这样的:
{
name : "Joey"
}
我提取name属性,得到字符串"J"。我必须准确地说,它与所有其他用户帐户完美配合。
我在考虑编码问题?
提前感谢您的回答。
编辑:
以下是我如何获得服务器的响应:
+ (void)getDataFromServ:(NSString *)urlServ withCompletionHandler:(void (^)(NSDictionary *dataDic))completion {
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlServ]];
[request setHTTPMethod:@"GET"];
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler: ^(NSData *data, NSURLResponse *response, NSError *error) {
if (error) {
return;
}
NSDictionary *serDataDic = nil;
NSError* parseError;
if (data) {
serDataDic = [NSJSONSerialization JSONObjectWithData:data options:0 error:&parseError];
completion(serDataDic);
}
}];
[task resume];
}
以下是我如何处理响应:
...
[self getDataFromServ:urlServ withCompletionHandler:^(NSDictionary *dataDic) {
NSDictionary *response = [dataDic objectForKey:@"data"];
NSLog(@"Response : %@", response);
NSLog (@"Name : %@", [response objectForKey:@"name"]);
...
}
以下是相关日志:
Response :
{
name = "Joey";
}
Name : J
编辑2:
我刚刚注意到的另一件事是,当我提取一个属性并计算其长度时,长度比该属性长。例如,当我有一个包含15个字符的属性时,计算的长度为29,但该属性仍然只显示一个字符。
编辑3:
我测试了其他东西:
for (NSInteger j = 0; j < displayNameStr.length; j++) {
NSLog(@"displayname : %@, j : %d", [nameExtracted substringFromIndex:j], j);
}
2015-04-07 11:25:34.778 myApp[434:131660] displayname : A
2015-04-07 11:25:34.778 myApp[434:131660] displayname :
2015-04-07 11:25:34.779 myApp[434:131660] displayname : l
2015-04-07 11:25:34.779 myApp[434:131660] displayname :
2015-04-07 11:25:34.779 myApp[434:131660] displayname : l
2015-04-07 11:25:34.780 myApp[434:131660] displayname :
2015-04-07 11:25:34.780 myApp[434:131660] displayname : a
2015-04-07 11:25:34.781 myApp[434:131660] displayname :
2015-04-07 11:25:34.781 myApp[434:131660] displayname : i
2015-04-07 11:25:34.781 myApp[434:131660] displayname :
2015-04-07 11:25:34.782 myApp[434:131660] displayname : n
2015-04-07 11:25:34.782 myApp[434:131660] displayname :
2015-04-07 11:25:34.783 myApp[434:131660] displayname : o
2015-04-07 11:25:34.784 myApp[434:131660] displayname :
2015-04-07 11:25:34.784 myApp[434:131660] displayname : u
2015-04-07 11:25:34.788 myApp[434:131660] displayname :
2015-04-07 11:25:34.788 myApp[434:131660] displayname : D
2015-04-07 11:25:34.789 myApp[434:131660] displayname : D
2015-04-07 11:25:34.789 myApp[434:131660] displayname :
2015-04-07 11:25:34.789 myApp[434:131660] displayname : u
2015-04-07 11:25:34.790 myApp[434:131660] displayname :
2015-04-07 11:25:34.790 myApp[434:131660] displayname : p
2015-04-07 11:25:34.790 myApp[434:131660] displayname :
2015-04-07 11:25:34.791 myApp[434:131660] displayname : r
2015-04-07 11:25:34.791 myApp[434:131660] displayname :
2015-04-07 11:25:34.792 myApp[434:131660] displayname : a
2015-04-07 11:25:34.792 myApp[434:131660] displayname :
2015-04-07 11:25:34.792 myApp[434:131660] displayname : -
2015-04-07 11:25:34.793 myApp[434:131660] displayname :
2015-04-07 11:25:34.793 myApp[434:131660] displayname : B
2015-04-07 11:25:34.794 myApp[434:131660] displayname :
2015-04-07 11:25:34.794 myApp[434:131660] displayname : e
2015-04-07 11:25:34.794 myApp[434:131660] displayname :
2015-04-07 11:25:34.795 myApp[434:131660] displayname : l
2015-04-07 11:25:34.795 myApp[434:131660] displayname :
2015-04-07 11:25:34.795 myApp[434:131660] displayname : l
2015-04-07 11:25:34.796 myApp[434:131660] displayname :
2015-04-07 11:25:34.796 myApp[434:131660] displayname : a
2015-04-07 11:25:34.798 myApp[434:131660] displayname :
2015-04-07 11:25:34.798 myApp[434:131660] displayname : n
2015-04-07 11:25:34.798 myApp[434:131660] displayname :
该名称的属性为:Allainou Dupra bellan
需要的代码。[收到代码!谢谢]
但是,你可以做的事情:
-
尝试在发生的行上放置一个断点,并检查变量以查看是否所有内容都在那里。
-
您是如何解码JSON的?试着看看你是否没有以你不应该的方式获得字符串。
-
使用HTTP(S)代理应用程序查看来自服务器的数据(Fiddler、Charles proxy、Wireshark)。
编辑:一切似乎都很好。。。奇怪的结果。但是,由于不遵守规范可能会导致奇怪的结果,请尝试:
替换:
serDataDic = [NSJSONSerialization JSONObjectWithData:data options:0 error:&parseError];
带有:
serDataDic = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingMutableContainers error:&parseError];
我不认为这是问题的根源,但值得一试。
另外,你能给我们从服务器上得到的整个JSON字符串吗?我用你提供的JSON在本地测试了它,我正确地得到了"Joey"。
编辑2:在你奇怪的长度结果之后,我肯定会检查服务器的响应。问题似乎不在你的Objective-C代码上。
尝试在[response objectForKey:@"name"]
:的末尾添加一个stringValue
[[response objectForKey:@"name"] stringValue]