【问题标题】:Convert NSData to NSString - NSLog limitation将 NSData 转换为 NSString - NSLog 限制
【发布时间】:2017-06-14 08:46:04
【问题描述】:

我正在尝试在 Zendesk 中将 NSData 转换为 NSString,但得到的字符串不完整,或者至少无法完全解码 data

当我curl以下命令时:

curl https://mySubdomain.zendesk.com/api/v2/users/1038194884/tickets/requested.json   -v -u myLogin:myPassword

我得到了正确的响应,它列出了这个用户的所有票,响应如下:

当我在objective-C 中尝试从iOS 应用程序中执行相同操作时,响应几乎相同,如下所示:

"Cache-Control" = "必须重新验证,私有,max-age=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-Rate-Limit-Remaining”= 399; "X-Request-Id" = "53c1b462-2dec-4c46-cc60-ecf4bbd76e89"; “X-运行时间”=“0.209525”; "X-UA 兼容" = "IE=Edge,chrome=1"; “X-Zendesk-API-版本”= v2; "X-Zendesk-应用程序版本" = "v8.28"; "X-Zendesk-Origin-Server" = "app4.pod7.fra1.zdsys.com"; "X-Zendesk-Request-Id" = 675a​​e5b4ff78fbe7

问题是当我尝试将data 转换为dictionaryNSString 时,我得到不完整的string。这是我正在使用的代码:

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":"https://mySubdomain.zendesk.com/api/v2/tickets/407.json","id":407,"external_id":null,"via":{"channel":"mobile_sdk","source":{ "from":{},"to":{},"rel":"mobile_sdk"}},"created_at":"2017-01-26T10:48:28Z","updated_at":"2017-01-26T11 :05:42Z","type":null,"subject":"Commentário sobre exercício.","raw_subject":"Commentário sobre exercício.","description":"Nome do usuário: bruna villete\nObjectId: qHQzNbjUzy\nPlano: Iron Training - 巴西\n\nDETALHES DO EXERCÍCIO: \nTitulo: CADEIRA EXTENSORA\nObjectId: qvq5deXxD9\nPerfil: MULHER INICIANTE\nFrequência: 5\nPeríodo: Semana1\nSérie: Serie B\n\n评论里奥: \nbom","priority":null,"status":"solved","re​​cipient":null,"requester_id":1038194884,"submitter_id":1038194884,"assignee_id":3030446965,"organization_id":null,"group_id ":24989965,"collaborator_ids":[],"forum_topic_id":null,"problem_id":null,"has_incidents":false,"is_public":true,"due_at":null,"tags":["seriecomment"] ,"custom_fields":[],"satisfaction_rating":null,"sharing_agreement_

【问题讨论】:

  • 究竟是什么意思不完整的字符串
  • 这意味着它停在第一张票的中间......这个特定的用户有几个票,如图所示并以 curl 形式返回。请参阅字符串的编辑问题。谢谢。
  • 您可以暂时将UITextView 添加到您的视图并将其text 属性设置为您的字符串,而不是使用NSLog...
  • 您也可以尝试以这种方式记录它:printf("%s", str.UTF8String); - 这样输出不应被切断。
  • @Jorge 最新的 Xcode 在 NSLog 和字典方面存在一些问题。这已被提及并询问了几个线程。在这里查看:stackoverflow.com/questions/39412917/…,对于 NSData 部分,我回答了如何解决您的问题,您需要将响应序列化为字典。如果答案解决了您的问题,请接受它是正确的:) GL

标签: ios objective-c json curl zendesk


【解决方案1】:

正如我在 cmets 中告诉您的,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"];

【讨论】:

  • 这与我的回答有何不同?
  • 它包括json解析。并且因为我在上面的 cmets 中回答了线程的问题,所以我创建了一个答案(正如@Jorge 要求我做的那样)。
  • 您的 cmets 是关于 NSLog 部分的,您在答案中的解决方案但是对于序列化是我的答案的副本。并且您不需要每次想要在某些东西上运行 NSLog 时都需要 textview,您可以遍历每个键并在控制台中注销值。但是我不会对您的答案投反对票,但是下次已经回答时不要复制其他人的答案。
  • 好吧...如果您觉得我复制了您的答案,请随时投反对票。该线程是关于“得到一个不完整的字符串”,这正是我在我的 cmets 中解释的 - 因此它就是答案! json 和数据访问部分只是一个额外的部分。我出去了:)
  • 我的答案比你早 10 分钟发布。那不是感觉那是事实。您的“评论”仅涉及 NSLog ,您建议用户在每次想要从字典中记录文本时创建一个 UITextView 。非常棒的提示。但是,您在这里的回答是我的副本,在您制作的 cmets 中只字未提。
【解决方案2】:

First convert the JSON response to NSDictionary

然后像往常一样从字典中访问您的 NSString。 (或您的 JSON 响应中的任何其他值/键)

NSString *myStr = [json objectForKey:@"someKey"];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 2012-11-09
    • 2011-11-11
    相关资源
    最近更新 更多