是否有一种简单的方法来判断任意字符串是否为Android中的格式良好的JSON



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

我已经通过Android JSON函数,找不到一个函数,简单地告诉你如果字符串是JSON或不是。有这样的函数吗?如果不是,我是否需要编写一些启发式的东西来捕获明显非json字符串?

检查其格式良好的JSON的确切方法是基于从HTTP Response返回的字符串创建JSONObject。如果结果字符串不是格式良好的JSON,将发生JSONException。

我不知道为什么你这么快就用完了内存。是因为返回的字符串非常大吗?如果是这样,您可以利用JSON格式的优势。检查字符串的第一个字符。如果是{,那么它可能是 JSON。否则,它就不是JSON。

请注意单词"probably"。这是因为我不知道服务器是否有时会给你另一个响应,{作为它的第一个字符,它不是JSON。你决定。

你应该阅读这里格式化的JSON字符串

您应该检查响应的Content-Type HTTP头。如果它返回HTML,它将是text/html。如果返回JSON,则为application/json

告诉您这是否是有效的JSON将需要完整的解析。Android捆绑了像XML DOM解析器一样的普通JSON解析器——这些解析器试图在内存中构建完整的语法树——因此它们容易出现

  • 低性能
  • 内存占用率高

我建议使用像GSON这样的pull解析器-如果您需要JSON中的对象或只是简化二进制(16KB)来解析(我将其与我自己的数据绑定层一起使用:https://github.com/ko5tik/jsonserializer),也可以使用某种类型的数据绑定。

类似于

Header contentType = httpResponse.getFirstHeader("Content-Type");
if (contentType.getValue().compareToIgnoreCase("application/json") != 0) {
    // response is not JSON
    response = null;
}

最新更新