org.json.JSONException:类型java.lang.String的值结果无法转换为JSONObject

时间:2016-04-05 14:04:38

标签: android json android-asynctask

获取org.json.JSONException:类型java.lang.String的值结果无法转换为JSONObject ..代码出错的位置?这是一个从实时流式传输中获取值的程序。完整代码如下: JSON给出

    race: {
  id: "44708",
  track_id: "1",
  track: "International",
  starts_at: "2016-05-04 06:16:00",
  finish_time: "1970-01-01 01:00:00",
  heat_type_id: "123",
  heat_status_id: "1",
  speed_level_id: "5",
  speed_level: "Nat Cadet & Junior",
  win_by: "position",
  race_by: "minutes",
  duration: 10,
  race_name: "Inkart National Heat",
  race_time_in_seconds: 276.336
},
scoreboard: [
  {
    position: "1",
    nickname: "Emily Linscott",
    average_lap_time: "90.053",
    fastest_lap_time: "60.490",
    last_lap_time: "60.490",
    rpm: "1225",
    first_name: "Emily",
    last_name: "Linscott",
    is_first_time: "0",
    total_races: "6",
    racer_id: "1157509",
    lap_num: "3",
    kart_num: "63",
    gap: ".000",
    ambtime: "31728819591"
  },

代码

protected JSONObject doInBackground(String... urls) {
        JSONObject jsonObj = null;
        Log.d("TAG","inside doInBackground..");
        try {
            URL url = new URL("http://daytonamk.clubspeedtiming.com/api/index.php/races/scoreboard.json?track_id=1&key=cs-dev" + kartNumber);
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setRequestMethod("GET");


            BufferedInputStream inputStream = new BufferedInputStream(urlConnection.getInputStream());
            String result = convertInputStreamToString(inputStream);
            parseResult(result);

            Log.e("Message", "This is a message");

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return jsonObj;
    }

    private String convertInputStreamToString(InputStream inputStream) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        StringBuilder builder = new StringBuilder();
        String line;
        String result = "";

        {
            while ((line = bufferedReader.readLine()) != null) {
                builder.append( line);
            }




            return result;

        }

    }


    private JSONObject parseResult(String result) {
        JSONObject jsonObj = null;
        if (result == null) {
            Toast.makeText(Main_Activity.this, "Race not currently running", Toast.LENGTH_LONG).show();
        } else {
            try {
                int number = 0;


                jsonObj = new JSONObject("result");

                JSONObject race = jsonObj.getJSONObject("race");
                int durationInMins = race.getInt("duration");
                String win_by = race.getString("win_by");

                JSONArray scoreboard = jsonObj.getJSONArray("scoreboard");
                Log.d("TAG", "Json value :" + scoreboard);
                for (int i = 0; i < scoreboard.length(); i++) {
                    JSONObject data = scoreboard.getJSONObject(i);


                    number = data.getInt("kart_num");


                    while (kartNumber == number) {
                        int gridPosition = data.getInt("position");
                        int gap = data.getInt("gap");
                        int lastLapTime = data.getInt("last_lap_time");
                        int bestLapTime = data.getInt("fastest_lap_time");


                        int raceInTime = race.getInt("race_time_in_seconds");

                        duration = durationInMins * 60 - raceInTime;


                        if (!(gridPosition == 1)) {
                            JSONObject dataPreviousGap = scoreboard.getJSONObject(i - 1);
                            int gapPrev = dataPreviousGap.getInt("gap");
                            gapUp = gap - gapPrev;
                        }
                        if (!(i == scoreboard.length() - 1)) {
                            JSONObject dataNext = scoreboard.getJSONObject(i + 1);
                            int gapNext = dataNext.getInt("gap");
                            gapDown = gapNext - gap;
                        }
                    }
                }


            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
        return  jsonObj;
    }


    protected void onPostExecute(JSONObject jsonObj) {

        Intent myIntent = new Intent(Main_Activity.this, Display_Activity.class);

        try {
           JSONObject jsonObje = new JSONObject("result");

        JSONArray scoreboard = jsonObje.getJSONArray("scoreboard");
        for (int i = 0; i < scoreboard.length(); i++) {
        JSONObject data = scoreboard.getJSONObject(i);
        myIntent.putExtra("GridPosition", data.getInt("position"));
        myIntent.putExtra("LastLapTime", data.getInt("last_lap_time"));
        myIntent.putExtra("MinutesToGo", duration);
        myIntent.putExtra("BestLapTime",data.getInt("fastest_lap_time"));
        myIntent.putExtra("GapUp", gapUp);
        myIntent.putExtra("GapDown", gapDown);

        }

1 个答案:

答案 0 :(得分:0)

正如您的logcat读取org.json.JSONException: Value result of type java.lang.String cannot be converted to JSONObject

一样

记录您获得的响应,而不首先解析数据。然后,您可以找到您正在处理的数据类型,例如:Strings, Integers, Floats,等。

在此处发布回复以获得更多帮助。

编辑: 这一行jsonObj = new JSONObject("result"); 请改为jsonObj = new JSONObject(result);

编辑:

&#13;
&#13;
jsonObj = new JSONObject(result);
JSONObject obj = jsonObj.getJSONObject("race"); 
String id = obj.getString("id");
//do the same for all objects inside race 
&#13;
&#13;
&#13;