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، یکی از فایل های فعالیت پروژه را باز کنید و روی آیکن RunEclipse Run Icon از تولبار کلیک کنید. Eclipse برنامه را روی AVD شما نصب و آغازمی کند و اگر همه چیز در مورد برنامه و تنظیمات درست باشد، پنجره ی Emulator زیر نمایش داده خواهد شد.

Anroid XML Parser Tutorial

مثال بالا داده ها را از رشته ی Json نمایش می دهد.این داده های از سوی کارفرما به عنوان اطلاعات حقوقی هستند.