هیچ دوره ای در سبد آموزش شما وجود ندارد
تجزیه کننده JSON اندروید
صفحه نخستJSON مخفف JavaScript Object Notation می باشد، که حالتی از تبادل مستقل داده و بهترین جایگزین برای XML می باشد. در آموزش تجزیه کننده JSON اندروید توضیح می دهد که چگونه یک فایل JSON را تجزیه کرده و اطلاعات لازم را از آن استخراج کنیم.
اندروید چهار گروه مختلف برای اجرای داده ی JSON ارائه می دهد که عبارتند از: JSONArray و JSONObjectو JSONStringer و JSONTokenizer .
اولین مرحله مشخص کردن فیلد هایی در داده ی JSON می باشد .در JSON ارائه شده در زیر ، فقط علاقه مند به گرفتن دما هستیم.
{ "sys": { "country":"GB", "sunrise":1381107633, "sunset":1381149604 }, "weather":[ { "id":711, "main":"Smoke", "description":"smoke", "icon":"50n" } ], "main": { "temp":304.15, "pressure":1009, } }
المان های های JSON
یک فایل JSON دارای مولفه های بسیاری می باشد. در این جا جدول مولفه های JSON و تعریف آن ها را مشاهده می کنید :
شماره | کامپوننت و توضیحات |
1 | ([)Array
در یک فایل JSON کروشه ( [ ) نشان دهنده ی یک ردیف JSON می باشد. |
2 | ({ )Objects
در یک فایل JSON این علامت (}) نشان دهنده ی یک آبجکت JSON می باشد. |
3 | Key
یک آبجکت JSON کلیدی است که فقط یک رشته می باشد. جفت های کلید/مقدار(value/key) یک آبجکت JSON را تشکیل می دهند |
4 | Value
هر کلید می تواند مقداری داشته باشد که این مقدار می تواند رشته ، integer یا double یا غیره باشد |
تجزیه کننده JSON اندروید
برای تجزیه ی JSON یک آبجکت از کلاس JSONObject ایجاد خواهیم کرد و یک رشته (string ) شامل داده ی JSON برای آن مشخص می کنیم.
ترکیب آن مانند زیر می باشد.
String in; JSONObject reader = new JSONObject(in);
آخرین مرحله ، تجزیه ی JSON است. یک فایل JSON شامل آبجکت های مختلف با جفت های مختلف key/value و غیره می شود. بنابراین JSONObject دارای تابع مجزا برای تجزیه ی هر مولفه از فایل JSON می باشد. ترکیب آن به شکل زیر است :
JSONObject sys = reader.getJSONObject("sys"); country = sys.getString("country"); JSONObject main = reader.getJSONObject("main"); temperature = main.getString("temp");
متد getJSONObject آبجکت JSON را گزارش می دهد. روش getString مقدار رشته ی یک کلید مشخص را گزارش می دهد (return می کند) .
علاوه بر این متد ها، متد های دیگری برای تجزیه ی بهتر JSON توسط این کلاس ارائه می شوند که می توانید در لیست زیر مشاهده کنید :
شماره | متد و توضیحات |
1 | (get(String name
این متد فقط مقدار را return می کند، اما به شکل آبجکت |
2 | (getBoolean(String name
این متد مقدار Boolean مشخص شده توسط کلید را return می کند. |
3 | (getDouble(String name
این متد مقدار double مشخص شده توسط کلید را return می کند. |
4 | (getInt(String name
این متد مقدار صحیح ( integer) مشخص شده توسط کلید را return می کند. |
5 | (getLong(String name
این متد مقدار طولی (long value) مشخص شده توسط کلید را return می کند. |
6 | ()length
این متد تعداد نگاشت های نام / مقدار (name/value) در این آبجکت را return می کند |
7 | ()names
این متد آرایه ای از نام های رشته ای در این آبجکت را return می کند . |
مثال
برای تست این مثال نیاز به یک دستگاه واقعی یا یک امولاتور دارید.
مرحله | توضیحات |
1 | برای ایجاد یک اپلیکیشن اندروید از Android studio استفاده می کنیم |
2 | فایل src/MainActivity.java را برای افزودن کد لازم تغییر دهید. |
3 | res/layout/activity_main را برای افزودن مولفه های XML مربوطه تغییر دهید. |
4 | res/values/string.xml را برای افزودن مولفه های رشته ی لازم تغییر دهید. |
5 | یک فایل جاوای جدید تحت src/HandleJSON.java ایجاد کنید تا داده XML رابه دست آورده و تجزیه کنید. |
6 | AndroidManifest.xml را برای اجازه ضروری اینترنت تغییر دهید. |
7 | برنامه را اجرا کنید، یک دستگاه اجرایی اندروید انتخاب کنید و برنامه را روی آن نصب کرده و نتایج را بررسی کنید. |
محتوای تغییر یافته ی src/MainActivity.java :
package com.example.tutorialspoint7.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 :
package com.example.tutorialspoint7.myapplication; 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; 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(); } }
محتوای تغیییر یافته ی res/layout/activity_main.xml :
<?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.tutorialspoint7.myapplication.MainActivity"> <ListView android:id="@+id/list" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </RelativeLayout>
محتوای تغییر یافته res/layout/list_item.xml :
<?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 :
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.tutorialspoint7.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>
اجازه بدهید برنامه ی JSONParserخود را اجرا کنیم. فرض می کنیم که در هنگام انجام تنظیمات محیط، AVD خود را ایجاد کرده اید. برای اجرای برنامه از eclipse، یکی از فایل های فعالیت پروژه را باز کنید و روی آیکن Run از تولبار کلیک کنید. Eclipse برنامه را روی AVD شما نصب و آغازمی کند و اگر همه چیز در مورد برنامه و تنظیمات درست باشد، پنجره ی Emulator زیر نمایش داده خواهد شد.
مثال بالا داده ها را از رشته ی Json نمایش می دهد.این داده های از سوی کارفرما به عنوان اطلاعات حقوقی هستند.