no-img
آرتیکلر

تجزیه محتوای فایل JSON یا JSON Parser در اندروید - آرتیکلر


آرتیکلر
کلاس ریاضی در رشت و بندرانزلی

ادامه مطلب

تجزیه محتوای فایل JSON یا JSON Parser در اندروید


مقدمه

وبسایت آرتیکلر. برای کاربرانی که دوره آموزش برنامه نویسی اندروید را دنبال می کنند، این بخش را ارائه میکند. JSON مخفف JavaScript Object Notation است و بهترین جایگزین برای XML است. و از آن جایی که برای طراحی رابط کاربری اپلیکیشن های اندروید از XML استفاده می شود، آشنایی با طرز کار با JSON Parser در برنامه نویسی اندروید لازم است. از این رو ما در این بخش نحوه  JSON Parser در اندروید را برای تجزیه فایل JSON و استخراج اطلاعات لازم از آن را برای علاقه مندان به یادگیری این تکنیک توضیح داده ایم.

JSON Parser در برنامه نویسی اندروید

در ادامه به طرز کار با JSON Parser در برنامه نویسی اندروید و متدهای کاربردی آن می پردازیم.

همچنین در ادامه ی بخش به یک مثال کاربردی و ساده در این زمینه پرداخته ایم.

اندروید ۴ کلاس مختلف را برای مدیریت داده JSON ارائه می دهد.

این کلاس ها شامل JSONArray,JSONObject,JSONStringer و JSONTokenizer می باشند.

اولین گام این است که فیلدهای داده های JSON که شما به آن علاقه مند هستید را شناسایی کنید.

برای نمونه در مثال زیر ما تنها temperature را می گیریم:

{
   "sys":
   {
      "country":"GB",
      "sunrise":1381107633,
      "sunset":1381149604
   },
   "weather":[
      {
         "id":711,
         "main":"Smoke",
         "description":"smoke",
         "icon":"50n"
      }
   ],
  
  "main":
   {
      "temp":304.15,
      "pressure":1009,
   }
}

عناصر JSON

یک فایل JSON شامل اجزای زیادی است که در جدول زیر لیست شده است:

ردیف اجزا و توضیحات
۱

Array([)

یک فایل JSON داخل براکت ([) شامل یک آرایه می شود.

۲

Objects({)

یک فایل JSON داخل ({) یک آبجکت است.

۳

Key

یک شی JSON حاوی کلید است که فقط یک رشته است.

۴ Value

هر یک از مقادیر KEY می تواند شامل string , 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 مقدار 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:

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 نیز به صورت زیر است:

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();
   }
}

 

محتوای XML  فایل 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.Pvlearn.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.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 Parser در برنامه نویسی اندروید

JSON Parser در برنامه نویسی اندروید

 

مثال فوق داده ها را از رشته ی json نمایش می دهد.

اطلاعات فوق شامل جزئیات کارفرمایان و همچنین اطلاعات حقوق و دستمزد است.

کلام آخر

همانطور که اشاره کردیم ، JSON که یک کتابخانه از جاوااسکریپت است به عنوان بهترین جایگزین برای XML معرفی شده است، که قابلیت های بسیاری را برای طراحی رابط کاربری در اندروید استدیو فراهم می کند. از این رو مباحث این بخش را به چگونگی  JSON Parser در برنامه نویسی اندروید اختصاص دادیم.

منبع: کلیک سایت

به این مطلب امتیاز دهید!
[تعداد رای: 1 میانگین رای: 5]


موضوعات :

مطالب مرتبط


دیدگاه ها


دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *