java.lang.String类型的值无法转换为JSONArray

我花了两天时间找到有问题的解决方案。

这是错误:

E/log_tag: Error parsing data org.json.JSONException: Value of type java.lang.String cannot be converted to JSONArray 

这是JSON:

 [ { "Id": "5207fc6473516724343ce7a5", "Name": "Эриван", "Types": [ "Ресторан" ], "Latitude": 53.904752, "Longitude": 27.521095, "OperatingTime": [ { "Day": 1, "Start": "10:00:00", "Finish": "23:00:00" }, { "Day": 2, "Start": "10:00:00", "Finish": "23:00:00" }, { "Day": 3, "Start": "10:00:00", "Finish": "23:00:00" }, { "Day": 4, "Start": "10:00:00", "Finish": "23:00:00" }, { "Day": 5, "Start": "10:00:00", "Finish": "23:00:00" }, { "Day": 6, "Start": "08:00:00", "Finish": "23:00:00" }, { "Day": 0, "Start": "08:00:00", "Finish": "23:00:00" } ], "IsBookingAvailable": false }] 

获取字符串值的类:

 public class JSONGet { public static String getJSONfromURL(String url){ InputStream is = null; String result = ""; JSONArray jArray = null; // Download JSON data from URL try{ HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost(url); HttpResponse response = httpclient.execute(httppost); HttpEntity entity = response.getEntity(); is = entity.getContent(); }catch(Exception e){ Log.e("log_tag", "Error in http connection "+e.toString()); } // Convert response to string try{ BufferedReader reader = new BufferedReader(new InputStreamReader(is,"UTF-8"),8); StringBuilder sb = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } is.close(); result = sb.toString(); }catch(Exception e){ Log.e("log_tag", "Error converting result "+e.toString()); } try{ jArray = new JSONArray(result); }catch(JSONException e){ Log.e("log_tag", "Error parsing data "+e.toString()); } return result; } 

}

这里转换为JSONArray:

 String jsonObjRecv = JSONGet.getJSONfromURL(URL_LIST); JSONArray jsonArr = new JSONArray(jsonObjRecv); 

我试图获取Json对象然后将其转换为Json数组,但我收到了同样的错误。

问题是您的JSON格式不正确。 我已尝试使用您的示例JSON并找到了解决方案。 现在内置的JSONObject和JSONArray不能用于获得这样的json响应。

您需要通过将json-simple库添加到gradle来将其添加到项目中:

 compile group: 'com.googlecode.json-simple', name: 'json-simple', version: '1.1' 

或者从这个链接下载“json-simple-1.1.1.jar”库https://json-simple.googlecode.com/files/json-simple-1.1.1.jar 。

然后,您可以轻松地解析您的JSON,它不会给出任何错误。 我已经为你做了一个小样本代码如何使用它:

 import org.json.simple.JSONArray; import org.json.simple.parser.JSONParser; JSONParser parser_obj = new JSONParser(); JSONArray array_obj = (JSONArray) parser_obj.parse("String from web service"); // in your case it will be "result" 

然后您可以根据需要进行处理。

在我的情况下,我没有解码jSon字符串,然后将其解析为jSon对象。 以下对我有用。

 JSONObject responseJSonObj = new JSONObject( URLDecoder.decode( result, "UTF-8" ) ); 

其中result包含要解析的jSon字符串。

JSON数据应始终以UTF-8编码(您的数据很可能是)。 但是,您使用ISO-8859-1阅读它。 由于您的JSON数据包含西里尔字符,因此它们将导致无法再解析为JSON的无效数据。 (在UTF-8中,西里尔字符需要两个字节。但是,ISO-8859-1将每个字节视为单独的字符。)

修复是使用正确的编码,很可能是UTF-8:

 BufferedReader reader = new BufferedReader(new InputStreamReader(is,"UTF-8")); 

更新:

您使用的代码通过Internet发布,有时使用ISO-8859-1,有时使用UTF-8。 如果您坚持使用标准,则使用ISO-8859-1编码的JSON无效。

Android JSON解析器非常不幸,因为它只支持字符串作为解析源。 因此,您正在使用的复杂代码需要解析JSON HTTP响应。 记忆和处理明智,效率很低。 如果谷歌扩展JSON解析器直接在InputStream实例上工作而不通过庞大的String实例绕道而行,那将是很好的。

更新2:

我刚刚意识到Android(从API级别11开始)包含一个在InputStream工作的JSON解析器。 但是,它位于不同的包中, 生成令牌流,而不是JSONObjectJSONArray实例。 我想我会自己编写缺少的代码来提出一个易于使用且高效的JSON解析器(生成JSONObjectJSONArray实例)。

更新3:

如果要解析的JSON文本无效,Android将抛出包含以下消息的exception:

 Value [{ "Id": "5207fc6473516724343ce7a5", "Name": "Эриван", ... }] of type java.lang.String cannot be converted to JSONArray 

由于在消息中的单词Valueof之间没有JSON数据,我怀疑你的JSON数据实际上是空的。

在您的代码中,您应该首先检查HTTP响应的状态代码( getStatusLine().getStatusCode() )。 此外,我似乎很奇怪您使用POST请求而不发布任何数据。 你不应该使用GET请求吗?

您的Json响应似乎很好。 但是,并不总能保证响应字符串始终充满数据。 为此,我建议你处理你的数组如下:

 JSONArray jsonArr = null; String jsonObjRecv = JSONGet.getJSONfromURL(URL_LIST); if(!TextUtils.isEmpty(jsonObjRecv)){ jsonArr = new JSONArray(jsonObjRecv); } else{ Log.w("json", "jsonObjRecv is null"); }