如何以 JSON 格式 NSLog NSData JSON 响应?

Posted

技术标签:

【中文标题】如何以 JSON 格式 NSLog NSData JSON 响应?【英文标题】:How to NSLog NSData JSON response in JSON format? 【发布时间】:2016-08-31 09:50:57 【问题描述】:

有没有办法可以NSLogJSONJSON格式回复NSData

NSLog(@"JSON NSString: %@" ,jsonData);

In this post 他们正在打印NSDictionary,我可以将其转换为 NSDictionary。并且this 解决方案返回(null)

我如何以 JSON 格式NSLog

【问题讨论】:

你的代码是什么来准确转换jsonData @Lamre jsonData 是 NSData。我需要代码来打印它。我可以将其转换为 NSDictionary 但无法在 codebeautify 中进行比较。 你确认你的 NSData 不是 nil。 @balkaransingh 是的 @ShuvoJoseph:你需要了解一两件事。如果你用 NSJSONSerialization 将 NSData 转换成 NSDictionary,然后打印出来,它将使用 NSDictionary 的描述方法。不是“JSON”的东西。你需要使用initWithData:encoding: 【参考方案1】:

• 出了什么问题:jsonData(如您所愿)不是代表 JSON 的 hexData。

• 快速hack(不可行的解决方案!)让您的 JSON 在您的网站中使用 CodeBeautify:

NSDictionary *dictFromData = [NSKeyedUnarchiver unarchiveObjectWithData:jsonData];
NSData *realJSONData = [NSJSONSerialization dataWithJSONObject:dictFromData options:0 error:nil];
NSString *strFINAL = [[NSString alloc] initWithData:realJSONData encoding:NSUTF8StringEncoding];
NSLog(@"StrFINAL: %@", strFINAL);

注意:是的,我绕过了 error 参数,我们不应该这样做。在options: 参数中使用 NSJSONWritingPrettyPrinted 而不是0,您的结果与CodeBeautify 的结果几乎相似。

• 我是如何到达那里的: 首先,我用this answer 复制/粘贴NSData 的凹凸字符串。 这样,我得到了jsonData,就像你一样。 然后,我简单地尝试了应该向您提供的信息:

NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingAllowFragments error:&errorJSON];

哪个没有给出错误:

Error Domain=NSCocoaErrorDomain Code=3840 "无法执行该操作 完全的。 (Cocoa 错误 3840。)”(字符 0 周围的值无效。) UserInfo=0x17598540 NSDebugDescription=字符周围的值无效 0.

但是有了NSDictionary *dictWithData = [NSKeyedUnarchiver unarchiveObjectWithData:jsonData];,我设法得到了真正的NSDictionary。但是NSKeyedArchiver/NSKeyedUnarchiver 正在做与NSJSONSerialization“等效”的事情:它会序列化,将NSObject 转换为NSData(反之亦然)。但更强大:适用于任何符合NSCoding 的对象。在这里,由于它最初来自 JSON(仅 NSStringNSNumberNSArrayNSDictionary 对象,而不是自定义对象),因此无需更多代码即可工作。 例如,您是否尝试将其保存到 NSUserDefaults 并且它也不是 .plist (这也是我尝试的一个,我将 jsonData 保存到内存中,并使用 dictionaryWithContentsOfFile: 给了我奇怪的答案,但很重要在它的颠簸中:""$class" = "value = 23";" 引导我到NSKeyArchiver/NSKeyUnarchiver)。我不知道你到底做了什么。

• 结论:很明显,您在某处混合了在网络上找到的内容。你需要返工。你不能让它这样。您的代码在其他地方存在问题。你从哪里得到jsonData?你用它做了什么?

【讨论】:

我现在没有源代码。我可以在星期天回到办公室时试试这个。数据来自.Net 服务器。你是大师。【参考方案2】:

代码:

NSLog("Formatted JSON : %@" ,[[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]);

【讨论】:

【参考方案3】:

有不同的情况。如果解析 JSON 数据没问题,那么您只想记录结果(字典或数组)。如果解析 JSON 数据失败,并且您怀疑 JSON 数据有问题,那么您将 JSON 数据转换为 NSString 并记录下来。最后,如果转换为 NSString 失败,或者您查看 NSString 并找不到它的问题,那么您记录 NSData 本身以便能够查看字节。如果有人设法将控制字符或其他一些废话放入您的 JSON 数据中,这将非常有用。

最好的方法是编写一个方法(警告!胆小者不要!需要自己编写代码)获取 NSData,对其进行分析并打印出您需要的信息。

【讨论】:

问题是作者混合了太多东西。例如,使用 jsonData 您无法检索“JSON”(通常在 99.9% 的情况下),但使用 [NSKeyedUnarchiver unarchiveObjectWithData:jsonData] 您可以。但他/她在某处使用了NSCoding

以上是关于如何以 JSON 格式 NSLog NSData JSON 响应?的主要内容,如果未能解决你的问题,请参考以下文章

将 JSON 转换为 NSData 以进行归档

AFNetworking,使用 POST 上传简单的 NSData

我如何从 json 中取出值并在 NSLog 中显示它们

我将一些数据发送到 web 服务,它返回一些 JSON 作为 NSData。如何转换为字典?(iOS 4.3)

如何以编程方式将 NSData 转换为 NSString? [复制]

如何将 NSString 转换为 NSData?并且数据与字符串内容相同