是否有一种简单的方法可以判断Android中的任意字符串是否是格式正确的JSON?

时间:2011-11-04 13:33:26

标签: android json

我们正在编写一个与JSON中基于互联网的CMS通信的应用程序。不幸的是,某些类型的网络连接例如通过公共Wifi有一个网络网关,他们要求你通过,然后才能正常使用网络。这意味着我们正在尝试JSON解析HTML网页。我希望它会抛出一个异常,说明HTML不是格式良好的JSON,而是试图解析它,耗尽内存并崩溃。

我查看了Android JSON函数,找不到一个只是告诉你字符串是否为JSON的函数。有这样的功能吗?如果没有,我是否只需编写一些启发式来捕获明显非JSON字符串?

4 个答案:

答案 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;
}