Android STUDIO: чтение JSON из URL
Задача: прочитать и пропарсить c URL ресурса JSON данные.
Как ни удивительно, такие тривиальные вещи в Android требуют кучу телодвижений. Возможно это сделано в угоду универсальности..но мне не понравилось от слова совсем. Плюс пришлось тянуть «стороннюю» библиотеку. Может быть конечно плохо гуглил.
Решение:
1) В build.grade добавим
1 |
implementation 'com.android.volley:volley:1.1.0' |
2) Добавим класс..ну например ReadJsonAccounts:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
package цукаука; import android.content.Context; import android.util.Log; import android.widget.Toast; import com.android.volley.Request; import com.android.volley.RequestQueue; import com.android.volley.Response; import com.android.volley.VolleyError; import com.android.volley.toolbox.StringRequest; import com.android.volley.toolbox.Volley; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.UnsupportedEncodingException; import java.util.ArrayList; public class ReadJsonAccounts { public ReadJsonAccounts(Context context,String url) { StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>(){ @Override public void onResponse(String response) { try { Log.i("Info", response); JSONObject object = new JSONObject(EncodingToUTF8(response)); JSONArray jsonArray = object.getJSONArray("users"); ArrayList<JSONObject> listItems = getArrayListFromJSONArray(jsonArray); // чтото делаем с получившимся JSON if(jsonArray!= null){ for(int i = 0; i<jsonArray.length();i++){ Log.i("Info", jsonArray.getJSONObject(i).getString("email")); } } }catch (JSONException e){ e.printStackTrace(); } } }, new Response.ErrorListener(){ @Override public void onErrorResponse(VolleyError error) { Toast.makeText(context,error.getMessage(),Toast.LENGTH_SHORT).show(); } }); RequestQueue requestQueue = Volley.newRequestQueue(context); requestQueue.add(stringRequest); } public static String EncodingToUTF8(String response){ try { byte[] code = response.toString().getBytes("ISO-8859-1"); response = new String(code, "UTF-8"); }catch (UnsupportedEncodingException e){ e.printStackTrace(); return null; } return response; } private ArrayList<JSONObject> getArrayListFromJSONArray(JSONArray jsonArray){ ArrayList<JSONObject> aList = new ArrayList<JSONObject>(); try { if(jsonArray!= null){ for(int i = 0; i<jsonArray.length();i++){ aList.add(jsonArray.getJSONObject(i)); } } }catch (JSONException js){ js.printStackTrace(); } return aList; } } |
3) Пример использования класса:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public class MainActivity extends AppCompatActivity { ReadJsonAccounts accounts; private static final String JSON_URL = "https://eй.seцйуайцуru/1.json"; private Context cntcur; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); cntcur=this; // нажата кнопка "синхронизировать" Button button = (Button) findViewById(R.id.sync_button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.i("Info", "--нажата кнопка Синхронизация"); accounts = new ReadJsonAccounts(cntcur,JSON_URL); } }); |