1

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

这是错误:

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

4 回答 4

3

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

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

implementation 'com.googlecode.json-simple:json-simple:1.1.1'

或从此链接下载库“json-simple-1.1.1.jar” https://repo1.maven.org/maven2/com/googlecode/json-simple/json-simple/1.1.1/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" 

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

于 2013-08-12T17:55:38.237 回答
2

在我的情况下,在将它解析为 json 对象之前,我没有解码 json 字符串。以下对我有用。

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

whereresult包含要解析的 json 字符串。

于 2014-09-19T20:26:12.197 回答
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"));

更新:

您使用的代码发布在整个 Internet 上,有时使用 ISO-8859-1,有时使用 UTF-8。如果你坚持标准,使用 ISO-8859-1 编码的 JSON 是无效的。

Android JSON 解析器非常不幸,因为它只支持字符串作为解析源。因此,解析 JSON HTTP 响应需要您使用的复杂代码。内存和处理方面,效率很低。如果 Google 将 JSON 解析器扩展为直接在一个InputStream实例上工作而不绕道通过一个巨大的String实例,那就太好了。

更新 2:

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

更新 3:

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

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

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

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

于 2013-08-12T19:10:36.680 回答
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");
}
于 2013-08-11T16:46:51.900 回答