检查来自 API 的响应是不是为有效 JSON
Posted
技术标签:
【中文标题】检查来自 API 的响应是不是为有效 JSON【英文标题】:Check if response from API is valid JSON检查来自 API 的响应是否为有效 JSON 【发布时间】:2012-03-29 22:00:40 【问题描述】:NSJSONSerialization
有没有办法检查NSData
是否是有效的 JSON?如果 API 由于某种原因返回无效 JSON,我不希望应用程序出错。
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]];
NSError *error;
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
【问题讨论】:
【参考方案1】:这不会“出错”,如果 JSON 无效,它只会返回 nil。因此,查看它是否为有效 JSON 的测试将是:
NSError *error;
if ([NSJSONSerialization JSONObjectWithData:data
options:kNilOptions
error:&error] == nil)
// Handle error
如果它确实返回了nil
,那么您可以检查error
看看出了什么问题。
【讨论】:
您能否提供一个示例代码,说明如何使用错误代码捕获错误?【参考方案2】:NSJSONSerialization
类有一个方法可以做到这一点......(编辑:不,它没有......)
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]];
id jsonObj = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
BOOL isValid = [NSJSONSerialization isValidJSONObject:jsonObj];
编辑:(在 hypercrypts 发表评论后)
Hypercrypt 是对的(我真的不明白我是怎么错过的)...
尽管我的回答似乎有效,但它错误。
isValidJSONObject:
方法所做的是检查对象是否可以序列化为 JSON,而不是相反。所以他的答案就是你要找的。如果您从 json 有效负载中获取可变副本,对其进行变异,然后想要检查尝试将其重新序列化回 JSON 字符串是否安全,则可以使用此方法。但底线是 hypercrypt 的答案是正确的,我认为将他的答案标记为正确而不是我的答案是非常公平的。无论如何,对于任何混淆,我深表歉意,感谢@hypercrypt 指出这一点:)
【讨论】:
这不是-[NSJSONSerialization isValidJSONObject:]
的用途。就是检查任意一个数组或字典是否有效转化为JSON字符串。
谢谢@hypercrypt - 这方面的文档不是很好。我以为我要疯了。
不适合我...即使它的有效 json 显示无效【参考方案3】:
真的没有办法在不使用 NSJSONSerialization 创建对象的情况下检查数据;我会把它放在一个try-catch中。如果您最终进入 catch 块,则它不是有效的 JSON。
编辑:想想看,如果遇到错误,'error' 是一个错误对象。因此,即使没有抛出任何内容,您也可以检查数据是否有效。
【讨论】:
以上是关于检查来自 API 的响应是不是为有效 JSON的主要内容,如果未能解决你的问题,请参考以下文章
jquery Datatable 无效 JSON 响应 1 ,数据被检查为有效 json
如何在 Python 中检查字符串是不是是有效的 JSON?