با عرض سلام و وقت بخیر خدمت کاربران سایت پی وی لرن . و کاربرانی که دوره کامل آموزش برنامه نویسی اندروید را دنبال می کنند. JSON مخفف JavaScript Object Notation است و بهترین جایگزین برای XML است. و از آن جایی که برای طراحی رابط کاربری اپلیکیشن های اندروید از XML استفاده می شود، آشنایی با طرز کار با JSON Parser در برنامه نویسی اندروید لازم است. از این رو ما در این بخش نحوه کار با JSON Parser در اندروید را برای تجزیه فایل JSON و استخراج اطلاعات لازم از آن را برای علاقه مندان به یادگیری این تکنیک توضیح داده ایم.
در ادامه به طرز کار با JSON Parser در برنامه نویسی اندروید و متدهای کاربردی آن می پردازیم.
همچنین در ادامه ی بخش به یک مثال کاربردی و ساده در این زمینه پرداخته ایم.
اندروید ۴ کلاس مختلف را برای مدیریت داده JSON ارائه می دهد.
این کلاس ها شامل JSONArray,JSONObject,JSONStringer و JSONTokenizer می باشند.
اولین گام این است که فیلدهای داده های JSON که شما به آن علاقه مند هستید را شناسایی کنید.
برای نمونه در مثال زیر ما تنها temperature را می گیریم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | { "sys": { "country":"GB", "sunrise":1381107633, "sunset":1381149604 }, "weather":[ { "id":711, "main":"Smoke", "description":"smoke", "icon":"50n" } ], "main": { "temp":304.15, "pressure":1009, } } |
یک فایل JSON شامل اجزای زیادی است که در جدول زیر لیست شده است:
ردیف | اجزا و توضیحات |
---|---|
۱ | Array([) یک فایل JSON داخل براکت ([) شامل یک آرایه می شود. |
۲ | Objects({) یک فایل JSON داخل ({) یک آبجکت است. |
۳ | Key یک شی JSON حاوی کلید است که فقط یک رشته است. |
۴ | Value هر یک از مقادیر KEY می تواند شامل string , integer یا double باشد. |
برای تجزیه یک شیء JSON باید یک آبجکت از کلاس JSONObject ایجاد کنید.
سپس یک رشته ی string را که حاوی داده JSON است را در آن تعریف کنید.
ساختار کار به صورت زیر است:
1 2 | String in; JSONObject reader = new JSONObject(in); |
آخرین مرحله این است که JSON را تجزیه کنید، یک فایل JSON شامل آبجکت های مختلف با مقادیر key/value مختلف است.
بنابراین JSONObject دارای یک تابع جداگانه برای تجزیه هر یک از اجزای فایل JSON است.
ساختار این کار به صورت زیر است:
1 2 3 4 5 | JSONObject sys = reader.getJSONObject("sys"); country = sys.getString("country"); JSONObject main = reader.getJSONObject("main"); temperature = main.getString("temp"); |
متد getJSONObject شیء JSON را برمی گرداند، متد getString مقدار string را از key مشخص شده برمی گرداند.
علاوه بر متدهای فوق، متدهای دیگری نیز برای تجزیه ی بهتر JSON ارائه شده که به شرح زیر است:
ردیف | متد و توضیحات مربوطه |
---|---|
۱ | get(String name) این متد مقدار را در قالب یک Object برمی گرداند. |
۲ | getBoolean(String name) این متد مقدار boolean مشخص شده با یک KEY را برمی گراند. |
۳ | getDouble(String name) این متد مقدار double مشخص شده با یک KEY را برمی گراند. |
۴ | getInt(String name)این متد مقدار integer مشخص شده با یک KEY را برمی گراند. |
۵ | getLong(String name) این متد مقدار long مشخص شده با یک KEY را برمی گراند. |
۶ | length() این متد تعداد عبارات name/value در این شی را باز می کند. |
۷ | names() این متد یک آرایه را باز می گرداند که شامل نام های رشته در این آبجکت است. |
اکنون برای درک بهتر مباحث به ارائه ی یک مثال ساده در این زمینه می پردازیم.
برای اجرا و تست این برنامه شما می توانید از یک دستگاه اندروید واقعی و یا یک شبیه ساز استفاده کنید.
مراحل انجام کار:
مراحل | توضیحات |
---|---|
۱ | مراحل ایجاد برنامه در اندروید استدیو را طبق بخش های قبلی دنبال کنید. |
۲ | کدهای مورد نیاز را در فایل src/MainActivity.java قرار دهید. |
۳ | طراحی متناسب با برنامه را به فایل res/layout/activity_main اضافه کنید. |
۴ | به محتوای فایل res/values/string.xml رشته های لازم را اضافه کنید. |
۵ | برنامه را اجرا کنید تا شبیه ساز اندروید نتیجه را نمایش دهد. |
محتوای بخش modified main در src/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 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 | ackage com.example.Pvlearn.myapplication; 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 ListView lv; 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(); Toast.makeText(MainActivity.this,"Json Data is downloading",Toast.LENGTH_LONG).show(); } @Override protected Void doInBackground(Void... arg0) { HttpHandler sh = new HttpHandler(); // Making a request to url and getting response String url = "http://api.androidhive.info/contacts/"; String jsonStr = sh.makeServiceCall(url); Log.e(TAG, "Response from url: " + jsonStr); if (jsonStr != null) { try { JSONObject jsonObj = new JSONObject(jsonStr); // Getting JSON Array node JSONArray contacts = jsonObj.getJSONArray("contacts"); // looping through All 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"); // Phone node is JSON Object JSONObject phone = c.getJSONObject("phone"); String mobile = phone.getString("mobile"); String home = phone.getString("home"); String office = phone.getString("office"); // tmp hash map for single contact HashMap<String, String> contact = new HashMap<>(); // adding each child node to HashMap key => value contact.put("id", id); contact.put("name", name); contact.put("email", email); contact.put("mobile", mobile); // adding contact to contact list 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); ListAdapter adapter = new SimpleAdapter(MainActivity.this, contactList, R.layout.list_item, new String[]{ "email","mobile"}, new int[]{R.id.email, R.id.mobile}); lv.setAdapter(adapter); } } } |
محتوای فایل 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 59 60 61 62 63 64 | <span class="kwd">package</span><span class="pln"> com.example.Pvlearn.myapplication</span><span class="pun">;</span> <span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">util</span><span class="pun">.</span><span class="typ">Log</span><span class="pun">;</span> <span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">io</span><span class="pun">.</span><span class="typ">BufferedInputStream</span><span class="pun">;</span> <span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">io</span><span class="pun">.</span><span class="typ">BufferedReader</span><span class="pun">;</span> <span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">io</span><span class="pun">.</span><span class="typ">IOException</span><span class="pun">;</span> <span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">io</span><span class="pun">.</span><span class="typ">InputStream</span><span class="pun">;</span> <span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">io</span><span class="pun">.</span><span class="typ">InputStreamReader</span><span class="pun">;</span> <span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">net</span><span class="pun">.</span><span class="typ">HttpURLConnection</span><span class="pun">;</span> <span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">net</span><span class="pun">.</span><span class="typ">MalformedURLException</span><span class="pun">;</span> <span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">net</span><span class="pun">.</span><span class="typ">ProtocolException</span><span class="pun">;</span> <span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">net</span><span class="pun">.</span><span class="pln">URL</span><span class="pun">;</span> <span class="kwd">public</span> <span class="kwd">class</span> <span class="typ">HttpHandler</span> <span class="pun">{</span> <span class="kwd">private</span> <span class="kwd">static</span> <span class="kwd">final</span> <span class="typ">String</span><span class="pln"> TAG </span><span class="pun">=</span> <span class="typ">HttpHandler</span><span class="pun">.</span><span class="kwd">class</span><span class="pun">.</span><span class="pln">getSimpleName</span><span class="pun">();</span> <span class="kwd">public</span> <span class="typ">HttpHandler</span><span class="pun">()</span> <span class="pun">{</span> <span class="pun">}</span> <span class="kwd">public</span> <span class="typ">String</span><span class="pln"> makeServiceCall</span><span class="pun">(</span><span class="typ">String</span><span class="pln"> reqUrl</span><span class="pun">)</span> <span class="pun">{</span> <span class="typ">String</span><span class="pln"> response </span><span class="pun">=</span> <span class="kwd">null</span><span class="pun">;</span> <span class="kwd">try</span> <span class="pun">{</span><span class="pln"> URL url </span><span class="pun">=</span> <span class="kwd">new</span><span class="pln"> URL</span><span class="pun">(</span><span class="pln">reqUrl</span><span class="pun">);</span> <span class="typ">HttpURLConnection</span><span class="pln"> conn </span><span class="pun">=</span> <span class="pun">(</span><span class="typ">HttpURLConnection</span><span class="pun">)</span><span class="pln"> url</span><span class="pun">.</span><span class="pln">openConnection</span><span class="pun">();</span><span class="pln"> conn</span><span class="pun">.</span><span class="pln">setRequestMethod</span><span class="pun">(</span><span class="str">"GET"</span><span class="pun">);</span> <span class="com">// read the response</span> <span class="typ">InputStream</span> <span class="kwd">in</span> <span class="pun">=</span> <span class="kwd">new</span> <span class="typ">BufferedInputStream</span><span class="pun">(</span><span class="pln">conn</span><span class="pun">.</span><span class="pln">getInputStream</span><span class="pun">());</span><span class="pln"> response </span><span class="pun">=</span><span class="pln"> convertStreamToString</span><span class="pun">(</span><span class="kwd">in</span><span class="pun">);</span> <span class="pun">}</span> <span class="kwd">catch</span> <span class="pun">(</span><span class="typ">MalformedURLException</span><span class="pln"> e</span><span class="pun">)</span> <span class="pun">{</span> <span class="typ">Log</span><span class="pun">.</span><span class="pln">e</span><span class="pun">(</span><span class="pln">TAG</span><span class="pun">,</span> <span class="str">"MalformedURLException: "</span> <span class="pun">+</span><span class="pln"> e</span><span class="pun">.</span><span class="pln">getMessage</span><span class="pun">());</span> <span class="pun">}</span> <span class="kwd">catch</span> <span class="pun">(</span><span class="typ">ProtocolException</span><span class="pln"> e</span><span class="pun">)</span> <span class="pun">{</span> <span class="typ">Log</span><span class="pun">.</span><span class="pln">e</span><span class="pun">(</span><span class="pln">TAG</span><span class="pun">,</span> <span class="str">"ProtocolException: "</span> <span class="pun">+</span><span class="pln"> e</span><span class="pun">.</span><span class="pln">getMessage</span><span class="pun">());</span> <span class="pun">}</span> <span class="kwd">catch</span> <span class="pun">(</span><span class="typ">IOException</span><span class="pln"> e</span><span class="pun">)</span> <span class="pun">{</span> <span class="typ">Log</span><span class="pun">.</span><span class="pln">e</span><span class="pun">(</span><span class="pln">TAG</span><span class="pun">,</span> <span class="str">"IOException: "</span> <span class="pun">+</span><span class="pln"> e</span><span class="pun">.</span><span class="pln">getMessage</span><span class="pun">());</span> <span class="pun">}</span> <span class="kwd">catch</span> <span class="pun">(</span><span class="typ">Exception</span><span class="pln"> e</span><span class="pun">)</span> <span class="pun">{</span> <span class="typ">Log</span><span class="pun">.</span><span class="pln">e</span><span class="pun">(</span><span class="pln">TAG</span><span class="pun">,</span> <span class="str">"Exception: "</span> <span class="pun">+</span><span class="pln"> e</span><span class="pun">.</span><span class="pln">getMessage</span><span class="pun">());</span> <span class="pun">}</span> <span class="kwd">return</span><span class="pln"> response</span><span class="pun">;</span> <span class="pun">}</span> <span class="kwd">private</span> <span class="typ">String</span><span class="pln"> convertStreamToString</span><span class="pun">(</span><span class="typ">InputStream</span> <span class="kwd">is</span><span class="pun">)</span> <span class="pun">{</span> <span class="typ">BufferedReader</span><span class="pln"> reader </span><span class="pun">=</span> <span class="kwd">new</span> <span class="typ">BufferedReader</span><span class="pun">(</span><span class="kwd">new</span> <span class="typ">InputStreamReader</span><span class="pun">(</span><span class="kwd">is</span><span class="pun">));</span> <span class="typ">StringBuilder</span><span class="pln"> sb </span><span class="pun">=</span> <span class="kwd">new</span> <span class="typ">StringBuilder</span><span class="pun">();</span> <span class="typ">String</span><span class="pln"> line</span><span class="pun">;</span> <span class="kwd">try</span> <span class="pun">{</span> <span class="kwd">while</span> <span class="pun">((</span><span class="pln">line </span><span class="pun">=</span><span class="pln"> reader</span><span class="pun">.</span><span class="pln">readLine</span><span class="pun">())</span> <span class="pun">!=</span> <span class="kwd">null</span><span class="pun">)</span> <span class="pun">{</span><span class="pln"> sb</span><span class="pun">.</span><span class="pln">append</span><span class="pun">(</span><span class="pln">line</span><span class="pun">).</span><span class="pln">append</span><span class="pun">(</span><span class="str">'\n'</span><span class="pun">);</span> <span class="pun">}</span> <span class="pun">}</span> <span class="kwd">catch</span> <span class="pun">(</span><span class="typ">IOException</span><span class="pln"> e</span><span class="pun">)</span> <span class="pun">{</span><span class="pln"> e</span><span class="pun">.</span><span class="pln">printStackTrace</span><span class="pun">();</span> <span class="pun">}</span> <span class="kwd">finally</span> <span class="pun">{</span> <span class="kwd">try</span> <span class="pun">{</span> <span class="kwd">is</span><span class="pun">.</span><span class="pln">close</span><span class="pun">();</span> <span class="pun">}</span> <span class="kwd">catch</span> <span class="pun">(</span><span class="typ">IOException</span><span class="pln"> e</span><span class="pun">)</span> <span class="pun">{</span><span class="pln"> e</span><span class="pun">.</span><span class="pln">printStackTrace</span><span class="pun">();</span> <span class="pun">}</span> <span class="pun">}</span> <span class="kwd">return</span><span class="pln"> sb</span><span class="pun">.</span><span class="pln">toString</span><span class="pun">();</span> <span class="pun">}</span> <span class="pun">}</span> |
محتوای XML فایل res/layout/activity_main.xml:
1 2 3 4 5 6 7 8 9 10 11 12 | <?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="com.example.Pvlearn.myapplication.MainActivity"> <ListView android:id="@+id/list" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </RelativeLayout> |
محتوای فایل res/layout/list_item.xml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <?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/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> |
محتوای فایل AndroidManifest.xml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.Pvlearn.myapplication"> <uses-permission android:name="android.permission.INTERNET"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> |
برای اجرای برنامه ی اندرویدی خود یکی از فایل های activity در برنامه ی خود کلیک کنید.
سپس روی نماد (Run) از نوار ابزار برای شروع اجرای برنامه کلیک کنید.
سپس نتیجه اجرای برنامه را در دستگاه اندروید خود مشابه زیر مشاهده خواهید کرد:
مثال فوق داده ها را از رشته ی json نمایش می دهد.
اطلاعات فوق شامل جزئیات کارفرمایان و همچنین اطلاعات حقوق و دستمزد است.
همانطور که اشاره کردیم ، JSON که یک کتابخانه از جاوااسکریپت است به عنوان بهترین جایگزین برای XML معرفی شده است، که قابلیت های بسیاری را برای طراحی رابط کاربری در اندروید استدیو فراهم می کند. از این رو مباحث این بخش را به چگونگی کار با JSON Parser در برنامه نویسی اندروید اختصاص دادیم.
مباحث بخش بعدی را به ارتباط با LinkedIn در برنامه نویسی اندروید اختصاص می دهیم.