Ios 将NSData转换为NSString-NSLog限制
我试图在Zendesk中将Ios 将NSData转换为NSString-NSLog限制,ios,objective-c,json,curl,zendesk,Ios,Objective C,Json,Curl,Zendesk,我试图在Zendesk中将NSData转换为NSString,但得到的字符串不完整,或者至少无法完全解码数据 当Icurl执行以下命令时: curl https://mySubdomain.zendesk.com/api/v2/users/1038194884/tickets/requested.json -v -u myLogin:myPassword 我得到了正确的响应,它列出了该用户的所有票证,响应如下:
NSData
转换为NSString
,但得到的字符串不完整,或者至少无法完全解码数据
当Icurl
执行以下命令时:
curl https://mySubdomain.zendesk.com/api/v2/users/1038194884/tickets/requested.json -v -u myLogin:myPassword
我得到了正确的响应,它列出了该用户的所有票证,响应如下:
当我尝试在objective-C
中从iOS
应用程序中访问相同的内容时,响应基本相同,如下所示:
“缓存控制”=“必须重新验证,私有,最大使用期限=0”;
连接=“保持活动”;
“内容编码”=gzip;
“内容类型”=“应用程序/json;字符集=UTF-8”;
日期=“2017年1月28日星期六20:36:38 GMT”;
Etag=“\”98b10cfcb2f1577122a1662926f9565c\”;
服务器=nginx;
“严格的交通安全”=“最大年龄=31536000;”;
“传输编码”=标识;
“X-Content-Type-Options”=nosniff;
“X-Frame-Options”=SAMEORIGIN;
“X-Rack-Cache”=未命中;
“X比率限制”=400;
“X-利率限制-剩余”=399;
“X-Request-Id”=“53c1b462-2dec-4c46-cc60-ECF4BD76E89”;
“X-Runtime”=“0.209525”;
“X-UA-Compatible”=“IE=Edge,chrome=1”;
“X-Zendesk-API-Version”=v2;
“X-Zendesk-Application-Version”=“v8.28”;
“X-Zendesk-Origin-Server”=“app4.pod7.fra1.zdsys.com”;
“X-Zendesk-Request-Id”=675ae5b4ff78fbe7
问题是,如果我试图将数据
转换为字典
或NSString
,我会得到不完整的字符串
。这是我正在使用的代码:
NSString *urlUser = [NSString stringWithFormat:@"https://mySubdomain.zendesk.com/api/v2/users/1038194884/tickets/requested.json"];
NSURL *url = [[NSURL alloc] initWithString:urlUser];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request addValue : @"application/json"
forHTTPHeaderField : @"Content-Type" ];
NSString *authStr = @"username:password";
NSData *authData = [authStr dataUsingEncoding:NSUTF8StringEncoding];
NSString *authValue = [NSString stringWithFormat: @"Basic %@",[authData base64EncodedStringWithOptions:0]];
[request setValue:authValue forHTTPHeaderField:@"Authorization"];
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request
completionHandler:
^(NSData *data, NSURLResponse *response, NSError *error) {
NSLog(@"finished");
if (!error)
{
NSLog(@"%@", data);
NSLog(@"RESPONSE: %@", response);
NSLog(@"length: %lu", data.length);
//Determine if string is null-terminated
char lastByte;
[data getBytes:&lastByte range:NSMakeRange([data length]-1, 1)];
NSString *str;
if (lastByte == 0x0) {
//string is null-terminated
str = [NSString stringWithUTF8String:[data bytes]];
} else {
//string is not null-terminated
str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}
NSLog(@"string length: %lu", str.length);
NSLog(@"%@", str);
NSLog(@"stop");
}
}];
[task resume];
顺便说一句,data
长度与curl
响应中的长度相同
记录的字符串:
{“tickets”:[{“url”:“,”id“:407,“external_id”:null”,via:{“channel”:“mobile_sdk”,“source”:{“from”:{},“to”:{},“rel”:“mobile_sdk”},”,创建于“:”2017-01-26T10:48:28Z”,“更新于“:”2017-01-26T11:05:42Z”,“type”:null,“subject”:“Comentário
sobre exercício.,“原始主题”:“Comentário sobre”
“实践”,描述:“Nome do usuário:bruna villete\n目标:
qHQzNbjUzy\n巴西:铁的训练\n\n巴西的训练:
\nTitulo:CADEIRA伸肌\n目标:qvq5deXxD9\n目标:MULHER
伊尼西亚特\nFrequencia:5\nPeríodo:Semana1\nérie:Serie
B\n\n协议:
\nbom,“优先级”:null,“状态”:“已解决”,“收件人”:null,“请求者id”:1038194884,“提交者id”:1038194884,“受让人id”:3030446965,“组织id”:null,“组id”:24989965,“合作者id”:[],“论坛主题id”:null,“问题id”:null,“有事件”:false,“是公共的”:true,“到期日”:null,“标记”:[“序列重要性”],“自定义字段”:[],“满意度评分”:空,“共享协议”_
然后像往常一样从字典中访问NSString(或JSON响应中的任何其他值/键)
正如我在评论中告诉你的那样,NSLog
语句似乎切断了字符串。一切正常
要处理数据,请将其转换为json对象,并按如下方式使用:
// convert the response data to json
NSError *error = nil;
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
if (!error) {
NSLog(@"json parsing succeeded.");
}
// access your data
NSArray *tickets = json[@"tickets"];
确切的意思是不完整的字符串?这意味着它停止在第一张票的中间……这个特定的用户有几个票,如图所示,在卷曲中返回。请参阅String的编辑问题。谢谢。不要使用<代码> NSCORL> < />代码>您可以临时添加一个<代码> UITExtVIEW <代码>到您的视图中,并设置其<代码>文本< /代码>rty到您的字符串…您也可以尝试这样记录:printf(“%s”,str.UTF8String)
-这样输出就不会被切断。@Jorge最新Xcode在NSLog和字典方面有一些问题。已经提到并询问了几个线程。检查这里:,对于NSData部分,我回答了如何解决您的问题,您需要将响应序列化到字典中。如果答案解决了您的问题,请接受它为正确:)gl这与我的答案有什么不同?它包括json解析。由于我在上面的评论中回答了线程的问题,我创建了一个答案(正如@Jorge要求我的那样)。您的评论是关于NSLog部分的,您的答案中的序列化解决方案是我的答案的副本。并且您不需要每次都使用textview来运行NSLog,您可以迭代每个键,并在控制台中注销这些值。不过,我不会对您的答案投反对票,但下次不要复制o其他人在已经回答的时候回答。好吧……如果你觉得我复制了你的答案,请随意否决它。该线程是关于“获取不完整的字符串”这正是我在评论中所解释的——因此这就是答案!json和数据访问部分只是一个额外的部分。我退出:)我的答案是在你的答案发布前10分钟发布的。这不是一种感觉,这是事实。你的“评论”只是关于NSLog,你建议用户每次想从字典中记录文本时都创建UITextView。非常棒的提示。但是,你在这里的回答是我的一份副本,在你的评论中没有提及。
// convert the response data to json
NSError *error = nil;
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
if (!error) {
NSLog(@"json parsing succeeded.");
}
// access your data
NSArray *tickets = json[@"tickets"];