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

时间:2013-08-11 16:21:14

标签: java android json

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

这是错误:

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数组,但我收到了同样的错误。

4 个答案:

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