如何以 JSON 格式 NSLog NSData JSON 响应?
Posted
技术标签:
【中文标题】如何以 JSON 格式 NSLog NSData JSON 响应?【英文标题】:How to NSLog NSData JSON response in JSON format? 【发布时间】:2016-08-31 09:50:57 【问题描述】:有没有办法可以NSLog
JSON
以JSON
格式回复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(仅 NSString
、NSNumber
、NSArray
和 NSDictionary
对象,而不是自定义对象),因此无需更多代码即可工作。
例如,您是否尝试将其保存到 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 响应?的主要内容,如果未能解决你的问题,请参考以下文章
AFNetworking,使用 POST 上传简单的 NSData
我将一些数据发送到 web 服务,它返回一些 JSON 作为 NSData。如何转换为字典?(iOS 4.3)