检查来自 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

使用 jq 检查字符串是不是是有效的 JSON

如何在 Python 中检查字符串是不是是有效的 JSON?

将字符串转换为 JSON 有效格式

如何向 Moya.Response JSON 添加一个字段,该字段不在来自 http 响应的真实有效负载中

在 Android 上调用返回 JSON 响应的 HTTP Web API 调用的最有效方法是啥?