Невозможно вернуть JSON Object в Object в приложении Android

Итак, у меня есть приложение для Android, над которым я работаю, которое выполняет API-вызов к серверу и возвращает информацию JSON. Теперь в моем приложении для Android я могу анализировать JSON, но только до первого массива. После этого говорится, что категория не существует.

Вот макет ответа JSON:

    [
  {
    "success": 0,
    "error": "string",
    "response": {
      "lastseen": 0,
      "mapstats": {
        "maps": [
          {
            "tier": 0,
            "modeid": 0,
            "modename": "string",
            "modecolor": "string",
            "bonus": 0,
            "name": "string",
            "rank": 0,
            "time": "string",
            "num_completed": 0
          }
        ],
        "highest_tier": 0,
        "num_beaten": 0,
        "percent_completion": 0
      },
      "tag_color": "string",
      "name": "string",
      "rank": 0,
      "avatar": "string",
      "tag": "string",
      "playtime": 0,
      "percent": 0
    }
  }
]

И вот мой класс Java:

package com.horizonservers.horizon;

import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Iterator;
import java.util.jar.Attributes;
import java.util.regex.Pattern;

import javax.net.ssl.HttpsURLConnection;


/**
 * A simple {@link Fragment} subclass.
 * Activities that contain this fragment must implement the
 * {@link MainFragment.OnFragmentInteractionListener} interface
 * to handle interaction events.
 * Use the {@link MainFragment#newInstance} factory method to
 * create an instance of this fragment.
 */
public class MainFragment extends Fragment {


    // TODO: Rename parameter arguments, choose names that match
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";

    // TODO: Rename and change types of parameters
    private String mParam1;
    private String mParam2;
    private static final Pattern delimeter = Pattern.compile(",\\s+");

    private TextView mResult;

    private OnFragmentInteractionListener mListener;

    public MainFragment() {
        // Required empty public constructor
    }

    /**
     * Use this factory method to create a new instance of
     * this fragment using the provided parameters.
     *
     * @param param1 Parameter 1.
     * @param param2 Parameter 2.
     * @return A new instance of fragment MainFragment.
     */
    // TODO: Rename and change types and number of parameters
    public static MainFragment newInstance(String param1, String param2) {
        MainFragment fragment = new MainFragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }

        new PostDataTask().execute("https://www.horizonservers.net/api/v1/PlayerInfo");


    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View v = inflater.inflate(R.layout.fragment_main, container, false);
        mResult = (TextView) v.findViewById(R.id.tv_result);
        return v;
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
    }


    // TODO: Rename method, update argument and hook method into UI event
    public void onButtonPressed(Uri uri) {
        if (mListener != null) {
            mListener.onFragmentInteraction(uri);
        }
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if (context instanceof OnFragmentInteractionListener) {
            mListener = (OnFragmentInteractionListener) context;
        } else {
            throw new RuntimeException(context.toString()
                    + " must implement OnFragmentInteractionListener");
        }
    }

    @Override
    public void onDetach() {
        super.onDetach();
        mListener = null;
    }

    /**
     * This interface must be implemented by activities that contain this
     * fragment to allow an interaction in this fragment to be communicated
     * to the activity and potentially other fragments contained in that
     * activity.
     * <p>
     * See the Android Training lesson <a href=
     * "http://developer.android.com/training/basics/fragments/communicating.html"
     * >Communicating with Other Fragments</a> for more information.
     */
    public interface OnFragmentInteractionListener {
        // TODO: Update argument type and name
        void onFragmentInteraction(Uri uri);
    }

    class PostDataTask extends AsyncTask<String, Void, String> {

        ProgressDialog progressDialog;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();

        }

        @Override
        protected String doInBackground(String... params) {

            try {
                return postData(params[0]);
            } catch (IOException ex) {
                return "Network error !";
            } catch (JSONException ex) {
                return "Data Invalid !";
            }
        }

        @Override
        protected void onPostExecute(String result) {

            try {
                JSONObject jsonObject = new JSONObject(result);

                String NameInfo = jsonObject.getString("name");

                JSONObject jsonObject1 = new JSONObject(NameInfo);

                for(int i = 0; i < jsonObject1.length(); i++){
                    JSONObject jsonPart = new JSONObject();

                    //Log.i("response", jsonPart.getString("response"));
                    String newName = jsonPart.getString("name");
                    //mResult.setText(NameInfo);
                    mResult.setText(newName);
                }


            } catch (JSONException e) {
                mResult.setText("Error!");
            }
            super.onPostExecute(result);


            if (progressDialog != null) {
                progressDialog.dismiss();
            }
        }


        private String postData(String urlPath) throws IOException, JSONException {

            StringBuilder result = new StringBuilder();
            BufferedWriter bufferedWriter = null;
            BufferedReader bufferedReader = null;

            try {
                //Create data to send to server
                JSONObject dataToSend = new JSONObject();
                dataToSend.put("apikey", "UPj07lqWdetOWrk9M8Ya9UZzeIAizjr4sYQRKzkHFYm1KaQDopytCFq9HHCerwNy");
                dataToSend.put("steamid", "STEAM_0:1:90345825");
                dataToSend.put("maptype", "surf");

                //Initialize and config request, then connect to server.


   URL url = new URL(urlPath);
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setReadTimeout(10000 /* milliseconds */);
            urlConnection.setConnectTimeout(10000 /* milliseconds */);
            urlConnection.setRequestMethod("POST");
            urlConnection.setDoOutput(true);  //enable output (body data)
            urlConnection.setRequestProperty("Content-Type", "application/json");// set header
            urlConnection.connect();

            //Write data into server
            OutputStream outputStream = urlConnection.getOutputStream();
            bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
            bufferedWriter.write(dataToSend.toString());
            bufferedWriter.flush();

            //Read data response from server
            InputStream inputStream = urlConnection.getInputStream();
            bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            String line;
            while ((line = bufferedReader.readLine()) != null) {
                result.append(line).append("&");
            }
        } finally {
            if (bufferedReader != null) {
                bufferedReader.close();
            }
            if (bufferedWriter != null) {
                bufferedWriter.close();
            }
        }

        return result.toS,tring();

    }
}

}

Конкретная часть, которая печатает информацию на экран

    @Override
    protected void onPostExecute(String result) {

        try {
            JSONObject jsonObject = new JSONObject(result);

            String NameInfo = jsonObject.getString("name");

            JSONObject jsonObject1 = new JSONObject(NameInfo);

            for(int i = 0; i < jsonObject1.length(); i++){
                JSONObject jsonPart = new JSONObject();

                //Log.i("response", jsonPart.getString("response"));
                String newName = jsonPart.getString("name");
                //mResult.setText(NameInfo);
                mResult.setText(newName);
            }


        } catch (JSONException e) {
            mResult.setText("Error!");
        }
        super.onPostExecute(result);


        if (progressDialog != null) {
            progressDialog.dismiss();
        }
    }

Как я могу разобрать эти объекты из массива / объектов. Я уже пытался преобразовать его в массив, но в этот момент он становится хуже. Спасибо заранее за вашу помощь.

 Destry16 июн. 2016 г., 03:37
да, но это возвращает все в массиве. Тогда у вас есть массив в массиве. Что я не знаю, как справиться
 Madhavan Malolan16 июн. 2016 г., 03:29
Что вы имеете в виду первый массив? Похоже, ваш корневой элемент - это массив, а не объект. Вы пробовали JSONArray (результат)?

Ответы на вопрос(3)

Решение Вопроса

какие данные из вашего ответа JSON вы пытаетесь извлечь. Но я думаю, что этот пример с Google Translate API поможет вам.

Ответ JSON:

"data": {
    "translations": [
        {
            "translatedText": "Hallo Welt",
            "detectedSourceLanguage": "en"
        }
    ]
}

Если я хочу получить переведенный текст "Hallo Welt", я делаю это так:

public String parseJSONForTranslation(String jsonString) {
    try {
        JSONObject object = (JSONObject) new JSONTokener(jsonString).nextValue();
        return object.getJSONObject("data").getJSONArray("translations").
                getJSONObject(0).getString("translatedText");
    }
    catch (JSONException e) {
        return null;
    }
}

Итак, как вы можете видеть, если вы хотите дополнительно извлечь информацию, перейдя на следующий «уровень» вашего ответа JSON, вы используете либо getJSONObject, либо getJSONArray (в зависимости от того, является ли он массивом или нет), пока не достигнете «уровня», где данные, которые вы хотите извлечь, находятся на. И вы используете getString только тогда, когда вы находитесь на последнем «уровне». Надеюсь, это поможет вам.

 Destry16 июн. 2016 г., 03:52
Хорошо, я сделал то, что ты сказал, это кажется хорошим; тем не менее, он только генерирует JSONException и не появляется сообщение об ошибке, почему
 Charles Li16 июн. 2016 г., 04:17
хахах нп, рад, что смог помочь!
 Destry16 июн. 2016 г., 04:15
Исправлено, извините, только немного на медленной стороне сегодня, спасибо! Ты восхитителен! Я просто смотрел на настройку неправильно! Ваш ответ идеален!
 Charles Li16 июн. 2016 г., 04:10
Возможно, вам не удастся помочь вам сразу же, но не стесняйтесь обновлять / публиковать код, который вы пробовали, так что кому-то другому или мне будет легко, когда у меня будет время помочь вам.

но я думаю, что-то вроде этого должно работать.

Корневой элемент в вашем JSON - это массив, поэтому мы начнем с него.

 public String parseJSONForTranslation(String json) throws JSONException {
  JSONArray array = new JSONArray(json);

  // We have an array, so we can loop through each inner object.
  for (int i = 0; i < array.length(); i++) {

     // Grab an object from the array so we can get the individual data
     JSONObject object = array.getJSONObject(i);

     // Variables that match the same key from your JSON
     int success = object.getInt("success");
     String error = object.getString("error");

     JSONObject response = object.getJSONObject("response");
     int lastSeen = response.getInt("lastseen");
     String tagColor = response.getString("tag_color");
     String name = response.getString("name");
     int rank = response.getInt("rank");
     String avatar = response.getString("avatar");
     String tag = response.getString("tag");
     int playTime = response.getInt("playtime");
     int percent = response.getInt("percent");

     JSONObject mapstats = response.getJSONObject("mapstats");
     int highestTier = mapstats.getInt("highest_tier");
     int numBeaten = mapstats.getInt("num_beaten");
     int percentCompletion = mapstats.getInt("percent_completion");

     JSONArray maps = mapstats.getJSONArray("maps");
     for (int i = 0; i < maps.length(); i++) {
        JSONObject map = maps.getJSONObject(i);
        int tier = map.getInt("tier");
        int modeId = map.getInt("modeid");
        String modeName = map.getString("mode_name");
        String modeColor = map.getString("mode_color");
        int bonus map.getInt("bonus");
        String name = map.getString("name");
        int rank = map.getInt("rank");
        String time = map.getString("time");
        int numCompleted = map.getInt("num_completed");
     }
  }
}

Вы можете создать массив JSON при неудачном создании объекта JSON

try {
    JSONObject jsonObject = new JSONObject(result);
    // do something
}catch (JSONException e) {
    try{
    JSONObject jsonObject = new JSONArray(result);
    // do something
    }catch(JSONException e){
    //...
    }
}

Ваш ответ на вопрос