آموزش json در برنامه نویسی اندروید
سلام دوستان در این سری از آموزش برنامه نویسی اندروید به آموزش json در برنامه نویسی اندروید می پردازیم در سری قبل به بررسی Json چیست پرداختیم که می توانید از لینک زیر json را مطالعه کنید در این آموزش به ما json را که در یک url قرار دارد می خوانیم و سپس در یک ListView قرار می دهیم در ادامه با ما همراه باشید.
Json چیست ؟
در این آموزش به خاطر اینکه از کتاب خانه ای استفاده نکنیم تا حجم برنامه بالا نره از کلاس های جاوا سفارشی استفاده می کنیم.
قبل از هر چیز وارد فایل AndroidManifest.xml شده و دسترسی زیر را اضافه کنید.
1 | <uses-permission android:name="android.permission.INTERNET"/> |
ابتدا یک فایل به نام HttpHandler.java ایجاد کرده و کد های زیر را در آن قرار دهید.
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 | package ir.programchi; import android.util.Log; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.ProtocolException; import java.net.URL; /** * Created by Jefferson on 01/09/17. */ public class HttpHandler { private static final String TAG = HttpHandler.class.getSimpleName(); public HttpHandler() { } public String makeServiceCall(String reqUrl) { String response = null; try { URL url = new URL(reqUrl); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); // read the response InputStream in = new BufferedInputStream(conn.getInputStream()); response = convertStreamToString(in); } catch (MalformedURLException e) { Log.e(TAG, "MalformedURLException: " + e.getMessage()); } catch (ProtocolException e) { Log.e(TAG, "ProtocolException: " + e.getMessage()); } catch (IOException e) { Log.e(TAG, "IOException: " + e.getMessage()); } catch (Exception e) { Log.e(TAG, "Exception: " + e.getMessage()); } return response; } private String convertStreamToString(InputStream is) { BufferedReader reader = new BufferedReader(new InputStreamReader(is)); StringBuilder sb = new StringBuilder(); String line; try { while ((line = reader.readLine()) != null) { sb.append(line).append('\n'); } } catch (IOException e) { e.printStackTrace(); } finally { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } return sb.toString(); } } |
کاری که کلاس بالا می کند این است کخ یک http call رو به یک url خاص ارسال می کند و سپس raw یا دیتای مربوطه که در اینجا یک json است را بر می گرداند.
بعد از این کار وارد فایل activity_main.xml شده (اکتیویتی اصلی ما) و یک ListView در آن قرار دهید همانند زیر
1 2 3 4 5 6 7 8 9 10 11 | <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <ListView android:id="@+id/list" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </RelativeLayout> |
برای اینکه یک شکل خاص برای هر آیتم ایجاد کنیم یک فایل به نام list_item.xml ایجاد کرده و کد های زیر را در آن قرار دهید.
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 | <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" android:padding="@dimen/activity_horizontal_margin"> <TextView android:id="@+id/name" android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingBottom="2dip" android:paddingTop="6dip" android:textColor="@color/colorPrimaryDark" android:textSize="16sp" android:textStyle="bold" /> <TextView android:id="@+id/email" android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingBottom="2dip" android:textColor="@color/colorAccent" /> <TextView android:id="@+id/mobile" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#5d5d5d" android:textStyle="bold" /> </LinearLayout> |
و حالا کد مربوط به MainActivity.java همانند زیر می شود.
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 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | package ir.programchi; import android.app.ProgressDialog; import android.os.AsyncTask; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.Toast; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; import java.util.HashMap; public class MainActivity extends AppCompatActivity { private String TAG = MainActivity.class.getSimpleName(); private ProgressDialog pDialog; private ListView lv; private static String url = "http://programchi.ir/api/contact.php"; ArrayList<HashMap<String, String>> contactList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); contactList = new ArrayList<>(); lv = (ListView) findViewById(R.id.list); new GetContacts().execute(); } private class GetContacts extends AsyncTask<Void, Void, Void> { @Override protected void onPreExecute() { super.onPreExecute(); // Showing progress dialog pDialog = new ProgressDialog(MainActivity.this); pDialog.setMessage("Please wait..."); pDialog.setCancelable(false); pDialog.show(); } @Override protected Void doInBackground(Void... arg0) { HttpHandler sh = new HttpHandler(); // Making a request to url and getting response String jsonStr = sh.makeServiceCall(url); Log.e(TAG, "Response from url: " + jsonStr); if (jsonStr != null) { try { JSONObject jsonObj = new JSONObject(jsonStr); JSONArray contacts = jsonObj.getJSONArray("contacts"); for (int i = 0; i < contacts.length(); i++) { JSONObject c = contacts.getJSONObject(i); String id = c.getString("id"); String name = c.getString("name"); String email = c.getString("email"); String address = c.getString("address"); String gender = c.getString("gender"); JSONObject phone = c.getJSONObject("phone"); String mobile = phone.getString("mobile"); String home = phone.getString("home"); String office = phone.getString("office"); HashMap<String, String> contact = new HashMap<>(); contact.put("id", id); contact.put("name", name); contact.put("email", email); contact.put("mobile", mobile); contactList.add(contact); } } catch (final JSONException e) { Log.e(TAG, "Json parsing error: " + e.getMessage()); runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(getApplicationContext(), "Json parsing error: " + e.getMessage(), Toast.LENGTH_LONG) .show(); } }); } } else { Log.e(TAG, "Couldn't get json from server."); runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(getApplicationContext(), "Couldn't get json from server. Check LogCat for possible errors!", Toast.LENGTH_LONG) .show(); } }); } return null; } @Override protected void onPostExecute(Void result) { super.onPostExecute(result); if (pDialog.isShowing()) pDialog.dismiss(); ListAdapter adapter = new SimpleAdapter( MainActivity.this, contactList, R.layout.list_item, new String[]{"name", "email", "mobile"}, new int[]{R.id.name, R.id.email, R.id.mobile}); lv.setAdapter(adapter); } } } |
کد بالا برای پارس کردن json های ساده بسیار عالی ولی برای josn های که complexity بالایی دارد بهتر از کتاب خانه volley یا okHttp استفاده کنید. قبلا کلاس Async را توضح دادیم در سایت جستجو کنید
این آموزش هم به پایان رسید.
موفق و موید باشید.
سلام
من با AIDE کار میکنم
مشکل من با همین AppCompatActivity
هست .
همین پروژه رو که با AppCompatActivity
وارد میکنم نرم افزار دچار stopped میشه
.
ولی extend Activity میکنم حل میشه
و این حل شدن شامل همه سورس ها نمیشه
اون سورس هایی که مثلا دارای اسلایدر هستن برطرف نمیشه و stopped میشه
لطفا جواب دادید یه ایمیل هم بدید
Please
سلام میتونید کتابخونه AppCompatActivity رو دانلود کنید که این هست
compile ‘com.android.support:appcompat-v7:25.0.0’
که این هست
اینم build.gradle
apply plugin: ‘com.android.application’
android {
compileSdkVersion 21
buildToolsVersion “21.1.0”
defaultConfig {
applicationId “com.mycompany.myapp”
minSdkVersion 14
targetSdkVersion 21
versionCode 1
versionName “1.0”
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’
}
}
}
dependencies {
compile ‘com.android.support:appcompat-v7:+’
compile fileTree(dir: ‘libs’, include: [‘*.jar’])
}
دوست عزیز توی styles تم خودتون معرفی کردین؟من خودم هم از AIDE استفاده میکنم باهاش کار کنید دستتون میاد زیر و بمش بی نظیره..
با Aide+ یا AndroidIDE کار کنید فوق العاده هستن
اگر ندارین تو ایتا به این آیدی پیام بدین براتون ارسال کنم
hadivafaii@
درود و آرزوی موفقیت… بزرگوار راستش برنامه اجرا میشه ولی چیزی بارگزرای نمیکنه خطا میده با این مضمون .
valu <!DOCTYPE of type java..lang.String cannot beconverted to JASONObject
راهنمایی کنید ممنون میشم.
سلام و خسته نباشید خدمت شما بنده هم با همین ارور مواجه میشم میشه کمک کنید خیلی ممنون valu <!DOCTYPE of type java..lang.String cannot beconverted to JASONObject
سلام
دارید اشتباه Json Object پارس می کنیدباید به شکل JSon array این کار را انجام دهید.
سلام.
واسه حل این ارور یه جورایی باید لینک مستقیم به فایل jsonبدید داخل هاستی که قرارش دادید.
از هاست رایگان هم نمیشه استفاده کرد و یه سری اپلود سنتر ها ی رایگان میتونن به درسی این کار رو انجام بدن یا اپلود کنی رو هاست اختصاصی خودت.
موفق باشید
دستتون دردنکنه خیلی عالی بود
درود
کسانی در برنامه اشان به صورت پشت سر هم میخواهند json دریافت کنند مثلا هر چند صد میلی ثانیه کتابخانه Retrofit را پیشنهاد میکنم امکانات خوبی دارد از gson بهتر است.
سلام
چرا برای اندروید بیشتر از 6 این ارور رو میده؟
Couldn’t get json from server, Check LogCat for possible error!
لطفا اگ میشه بگین!