我花了两天时间找到有问题的解决方案。
这是错误:
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数组,但我收到了同样的错误。
答案 0 :(得分:3)
问题是您的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"
然后您可以根据需要处理它。
答案 1 :(得分:2)
在我的情况下,我没有解码jSon字符串,然后将其解析为jSon对象。以下对我有用。
JSONObject responseJSonObj = new JSONObject( URLDecoder.decode( result, "UTF-8" ) );
其中result
包含要解析的jSon字符串。
答案 2 :(得分:1)
JSON数据应始终以UTF-8编码(您的数据很可能是)。但是,您使用ISO-8859-1阅读它。由于您的JSON数据包含西里尔字符,因此它们将导致无法再解析为JSON的无效数据。 (在UTF-8中,西里尔字符需要两个字节。但是,ISO-8859-1将每个字节视为一个单独的字符。)
修复是使用正确的编码,很可能是UTF-8:
BufferedReader reader = new BufferedReader(new InputStreamReader(is,"UTF-8"));
<强>更新强>
您使用的代码在整个互联网上发布,有时使用ISO-8859-1,有时使用UTF-8。如果您坚持使用标准,则使用ISO-8859-1编码的JSON无效。
Android JSON解析器非常不幸,因为它只支持字符串作为解析源。因此,您正在使用的复杂代码需要解析JSON HTTP响应。记忆和处理明智,效率很低。如果Google将JSON解析器扩展为直接在InputStream
实例上工作而不通过庞大的String
实例绕道而行,那将是很好的。
更新2:
我刚刚意识到Android(从API级别11开始)包含一个处理InputStream
的JSON解析器。但是,它位于不同的包中,仅生成令牌流,而不是 JSONObject 或 JSONArray 实例。我想我会自己编写缺少的代码来提供一个易于使用且高效的JSON解析器(生成 JSONObject 或 JSONArray 实例)。
更新3:
如果要解析的JSON文本无效,Android会抛出包含以下消息的异常:
Value [{ "Id": "5207fc6473516724343ce7a5", "Name": "Эриван", ... }] of type java.lang.String cannot be converted to JSONArray
由于消息中的 Value 和 之间没有JSON数据,我怀疑你的JSON数据实际上是空的。
在您的代码中,您应首先检查HTTP响应的状态代码(getStatusLine().getStatusCode()
)。此外,我似乎很奇怪您使用POST请求而不发布任何数据。你不应该使用GET请求吗?
答案 3 :(得分:0)
您的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");
}