آموزش کار با جیسون در اندروید

آموزش کار با جیسون در اندروید

آموزش جیسون JSON در برنامه نویسی اندروید به همراه مثال

JSON مخفف JavaScript Object Notation می باشد، که حالتی مستقل از داده و بهترین انتخاب برای XML می باشد.
این مقاله توضیح می دهد که چگونه یک فایل 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 و تعریف آن ها را مشاهده می کنید :

  • ([)Array : در یک فایل JSON کروشه ( [ ) نشان دهنده ی یک ردیف JSON می باشد.
  • ({ )Objects : در یک فایل JSON این علامت (}) نشان دهنده ی یک آبجکت JSON می باشد.
  • Key : یک آبجکت JSON کلیدی است که فقط یک رشته می باشد. جفت های کلید/مقدار(value/key) یک آبجکت JSON را تشکیل می دهند.
  • 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 توسط این کلاس ارائه می شوند که می توانید در لیست زیر مشاهده کنید :

 
  • (get(String name : این متد فقط مقدار را return می کند، اما به شکل آبجکت.
  • (getBoolean(String name : این متد مقدار Boolean مشخص شده توسط کلید را return می کند.
  • (getDouble(String name : این متد مقدار double مشخص شده توسط کلید را return می کند.
  • (getInt(String name : این متد مقدار صحیح ( integer) مشخص شده توسط کلید را return می کند.
  • (getLong(String name : این متد مقدار طولی (long value) مشخص شده توسط کلید را return می کند.
  • ()length : این متد تعداد نگاشت های نام / مقدار (name/value) در این آبجکت را return می کند .
  • ()names : این متد آرایه ای از نام های رشته ای در این آبجکت را return می کند .
  • آموزش برنامه نویسی اندروید
  • آموزش طراحی سایت
  • آموزش html

مثال :

برای تست این مثال نیاز به یک دستگاه واقعی یا یک امولاتور دارید.

  • برای ایجاد یک اپلیکیشن اندروید  از Android studio استفاده می کنیم
  • فایل src/MainActivity.java را برای افزودن کد لازم تغییر دهید.
  • res/layout/activity_main را برای افزودن مولفه های XML مربوطه تغییر دهید.
  • res/values/string.xml را برای افزودن مولفه های رشته ی لازم تغییر دهید.
  • یک فایل جاوای جدید تحت src/HandleJSON.java ایجاد کنید تا داده XML رابه دست آورده و تجزیه کنید.
  • AndroidManifest.xml را برای اجازه ضروری اینترنت تغییر دهید.
  • برنامه را اجرا کنید، یک دستگاه اجرایی اندروید انتخاب کنید و برنامه را روی آن نصب کرده و نتایج را بررسی کنید.
 

محتوای تغییر یافته ی 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>
 

می خواهیم اپلیکیشن مورد نظر را اجرا کنیم ؛ 
فرض می کنیم که در هنگام انجام تنظیمات محیط، AVD خود را ایجاد کرده اید. برای اجرای اپلیکیشن از Android studio ، یکی از فایل های اکتیویتی پروژه را باز کنید و روی آیکون Run از نوار ابزار  کلیک کنید. Android studio اپلیکیشن را روی AVD شما نصب و آغاز می کند و پنجره ی Emulator  نمایش داده خواهد شد.

مطالب خواندنی