我们正在编写一个与JSON中基于互联网的CMS通信的应用程序。不幸的是,某些类型的网络连接例如通过公共Wifi有一个网络网关,他们要求你通过,然后才能正常使用网络。这意味着我们正在尝试JSON解析HTML网页。我希望它会抛出一个异常,说明HTML不是格式良好的JSON,而是试图解析它,耗尽内存并崩溃。
我查看了Android JSON函数,找不到一个只是告诉你字符串是否为JSON的函数。有这样的功能吗?如果没有,我是否只需编写一些启发式来捕获明显非JSON字符串?
答案 0 :(得分:3)
检查格式良好的JSON的确切方法是根据HTTP Response返回的字符串创建JSONObject。如果生成的字符串不是格式良好的JSON,则会发生JSONException。
我不知道你为什么过早耗尽内存。是因为返回的字符串非常大吗?如果是这样,您可以利用JSON格式的优势。检查字符串的第一个字符。如果它是{
那么可能 JSON。否则,它不是JSON。
请注意“可能”一词。这是因为我不知道服务器是否有时会给你另一个响应{
作为它的第一个字符并且它不是JSON。你决定了。
您应该读取格式为here的JSON字符串。
答案 1 :(得分:2)
您应该检查响应的Content-Type
HTTP标头。如果它返回HTML,则为text/html
。如果它返回JSON,它将是application/json
。
答案 2 :(得分:2)
告诉你这是否是有效的JSON需要完整的解析。 Android捆绑了类似XML DOM解析器的vanilla JSON解析 - 这些解析器尝试在内存中构建完整的语法树 - 因此它们很容易
我建议使用像GSON一样的pull解析器 - 如果你需要JSON中的对象或者只是解析二进制(16KB)来解析(我将它与我自己的数据绑定一起使用),还有某种数据绑定会派上用场图层:https://github.com/ko5tik/jsonserializer)
答案 3 :(得分:1)
类似的东西:
Header contentType = httpResponse.getFirstHeader("Content-Type");
if (contentType.getValue().compareToIgnoreCase("application/json") != 0) {
// response is not JSON
response = null;
}