سایر مقالات این دسته
تاریخچه و خصوصیات اندرویداجزای تشکیل دهنده سیستم عامل اندرویدآشنایی با API های اندرویدایجاد،ساخت و اجرای اولین برنامه اندرویدیکار با دکمه ها در اندرویدکار با تکست باکس ها در اندرویدکار با تکست ویو در اندرویدکار با گرید ویو در اندرویدکار با وب ویو در اندرویدکار با اسکرول ویو در اندرویدکار با اسکرول ویو افقیکار با الرت دیالوگ (AlertDialog)در اندرویدکار با ایمیج باتن(Image Button) در اندرویدکار با توگل باتنکار با چک باکس (Checkbox) در اندرویدکار با الرت دیالوگ (AlertDialog)در اندروید قسمت دوکار با ریتینگ بار(Rating bar) در اندرویدرفتن از یک اکتویتی به اکتویتی دیگرکار با نوتیفیکیشن ها (Notifications )در اندرویدکار با صوت در برنامه نویسی اندرویدکار با ویبره(Vibrator) در اندرویدکار با دوربین در اندرویدکار با دوربین در اندرویدکار با ویدیو ویو (VideoView)در اندرویدکار با شبکه وای فای (Wifi)در اندرویدکار با لیست ویو (ListView) در اندرویدکار با سیک بار (SeekBar) در اندرویدکار با دکمه بازگشت در اندرویدکار با AutoCompleteTextView در اندرویدتغییر فونت در اندرویدکار با لایه TableLayout در اندرویدکار با لیست کشویی (Spinner) در اندرویدکار با CalendarView در اندرویدساخت شمارنده در اندرویدکار با title bar در اندرویدکار با منو (Menu)در اندرویدکار با لیست ویو (Listview) قسمت دومطراحی رابط کاربری در اندروید قسمت اولطراحی رابط کاربری در اندروید قسمت دوم(طراحی گرد)کار با استایل در اندرویدکار با لایه AbsoluteLayout در اندرویدطراحی رابط کاربری در اندروید کار با gradientکار با کلیپ بورد(ClipBoard)در اندروید کار با مولتی تاچ(Multitouch ) در اندروید+سورس کدکار با OnLongClick در اندرویدکار با منوی زمینه (ContextMenu ) در اندرویدکار با حرکات (Gesture) در اندرویدکار با (AudioCapture) در اندروید+سورس کدکار با موتور Speech در اندروید + سورسکار با PhoneCall در اندرویدساخت لیست ویو سفارشی در اندروید+سورسساخت Toastسفارشی در اندرویدانتقال برنامه به حافظه sdکار با TextWatcher در اندروید+سورستغییر رنگ محیط Eclipse طراحی رابط کاربری در اندروید کار با Canvasساخت اکشن بار سفارشی در اندروید+سورسساخت الرت دیالوگ سفارشی در اندرویدساخت برنامه نمایش مقدار شارژ باتری در اندرویدایجاد افکت رنگی بروی تصاویر در اندروید+سورسساخت آپشن منوی سفارشی در اندروید+سورسساخت دکمه سه بعدی با Selectorسخنان بزرگان برنامه نويسيوارد كردن پروژه در محيط ايكليپساضافه کردن switch,case به لیست ویوبارش برف بروی تصویر + سورسکار با فیلتر hue رنگی کردن تصویر انتخاب و پخش فایل صوتی از حافظه گوشی+سورساضافه کردن چک باکس به لیست ویوکار با ShelfView یا نمایش کتابخانه ای + سورسکار با TabHost،اضافه کردن تب به برنامه های اندرویدآموزش کامل ساخت اکشن بار سفارشی+سورسساخت برنامه های واکنش گرا(ریسپانسیو) در اندرویدقسمت دوم صفحات 7 اینچ به بالااضافه کردن انیمیشن به دکمه+سورسکار با View Switcher در اندروید + سورسکار با فیلتر Blur Mask + سورسدانلود پک کامل آیکون های طراحی اندرویدکار با sharedPreferences در اندروید+سورسآموزش کار با proguard،محافظت از برنامه اندرویدپخش فایل صوتی (MP3) از ادرس اینترنتی+سورسپخش ویدیو از آدرس اینترنتی(URL) در اندروید+سورسگوشی های و تبلت های مطرح تا چینی به ساده ترین روشپاسخ به رویداد های WebVeiw دسترسی به وب ویو با استفاده از جاوااسکریپتساخت ExpandableListView به ساده ترین شکل+سورسکار با WIFI اکسس+سورسساخت تقویم هجری برای اندروید+سورسapp rateدانلود و نمایش تصویر در ListView+سورسدانلود و نمایش فایل متنی+سورسکار با کلاس های پایه اکتیویتیآینه کردن تصویر+سورسافزودن آیتم منو سفارشی بهActionBar+سورسارسال اطلاعات از دیتابیس به GridView + سورسدسترسی به Api هایREST قسمت اولتغییر فونت لیست ویوفعال سازی و معرفی بخش های Android developer options بخش اول کار با JSON در اندرویدآموزش ساده نصب شبیه ساز اندروید Genymotion

کار با JSON در اندروید
1395/08/02

دسترسی به وب ویو با استفاده از جاوااسکریپت
1394/12/01

پاسخ به رویداد های WebVeiw
1394/12/01

کار با JSON در اندروید


رضا نقی لو 1395/08/02

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

JSONیک قالب متنی است و به هیچ زبانی وابسته نیست و قالب آن برای برنامه نویسان خانواده C ( تمام زبان های برنامه نویسی که ساختار نوشتاری مشابه سی دارند ، مانند سی ، سی پلاس پلاس ، جاوا ، جاوا اسکریپت ، سی شارپ و ...) بسیار آشناست. انتخاب نام این فرمت به این خاطر است که از استاندارد های زبان برنامه نویسی جاوا اسکریپت گرفته شده است (توجه کنید که این فقط یک نام است و JSON یک جز از جاوا اسکریپت یا هیچ زبان نویسی دیگری نیست).

همینکه کار با JSON را یاد بگیرید برنامه های بسیاری جالبی می توانید بنویسید زیرا امروز سایت های بسیاری هستند که امکانات بسیار جالب و مفیدی را به صورت خروجی JSON در اختیار شما قرار می دهند.

در این آموزش یک برنامه ساده می نویسیم که از سایت openweathermap.org یک خروجی JSON دریافت می کند و وضعیت هوا ، رطوبت و سرعت باد شهر tehran را نمایش می دهد.(برای اینکار از http://api.openweathermap.org/data/2.5/weather?q=tehran استفاده می کنیم که در ادامه متوجه نحوه استفاده از این آدرس خواهید شد.).

بهترین روش برای آشنایی با مفاهیم مختلف استفاده از مثال است ، در اینجا نیز در قالب مثال با JSON و اینکه چگونه سایت ها امکانات خود را به صورت خروجی JSON در اختیار ما قرار می دهند آشنا می شویم.

اگر در مرورگر خود آدرس http://api.openweathermap.org/data/2.5/weather?q=tehran را تایپ کنید ممکنه یک خروجی نامرتبط رو بپنشون بده ولی جای نگرانی نیست با استفاده از  سایت http://jsonprettyprint.com   و وارد کردن خروجی آن را مرتبط مانند زیر به ما نشان دهد :

 

{
  "coord": {
    "lon": 51.42,
    "lat": 35.69
  },
  "sys": {
    "message": 0.005,
    "country": "IR",
    "sunrise": 1420688669,
    "sunset": 1420724256
  },
  "weather": [
    {
      "id": 800,
      "main": "Clear",
      "description": "Sky is Clear",
      "icon": "01n"
    }
  ],
  "base": "cmc stations",
  "main": {
    "temp": 274.234,
    "temp_min": 274.234,
    "temp_max": 274.234,
    "pressure": 902.34,
    "sea_level": 1030.36,
    "grnd_level": 902.34,
    "humidity": 74
  },
  "wind": {
    "speed": 3.46,
    "deg": 290.003
  },
  "clouds": {
    "all": 0
  },
  "dt": 1420738673,
  "id": 112931,
  "name": "Tehran",
  "cod": 200
}

 

object : هر عبارتی است که با علامت } شروع شده و با { خاتمه می یابد. همانطور که مشاهده می کنید خروجی فوق خود یک  object است که در داخل آن object های دیگری وجود دارند.

array : آرایه در JSON با علامت ] شروع می شود و با علامت [ خاتمه می یابد.

 

key-value : جفت های کلید و مقدار در JSON با دو نقطه در وسط آن ها تعریف می شوند. در سمت چپ کلید (key) و در سمت راست مقدار (value ) قرار دارد.

 

سه مفهوم فوق به صورت تو در تو کنار هم قرار می گیرند و ساختار های بزرگ تر را ایجاد می کنند. به عنوان مثال کل خروجی قبلی یک object است زیرا با علامت } شروع می شود و با { خاتمه می یابد. در داخل این object عبارت های key-value بسیاری داریم که به عنوان مثال می توان به weather و main اشاره کرد. همانطور که مشاهده می کنید در جایی که weather کلید است مقدار یک آرایه است. و در مقابل main نیز یک object وجود دارد.

خب با JSON آشنا شدید ، اینکه سایت های مختلف چگونه خروجی JSON در اختیار ما قرار می دهند را نیز در قالب مثال دیدید پس چیزی نمانده ، تنها کاری که باید بکنیم به این صورت است :

 

  1. یک درخواست http از نوع GET یا POST  ارسال کنیم (مثلاً http://api.openweathermap.org/data/2.5/weather?q=tehran در همین مثال)
  2. خروجی درخواست فرستاده شده را به صورت Stream دریافت کنیم.
  3. Stream دریافت شده را به String تبدیل کنیم.
  4. String آماده شده را تجزیه و تحلیل (Parse) کنیم.( این String در قالب JSON است و از ابزار های کار با JSON در اندروید استفاده خواهیم کرد.

ارسال درخواست http و دریافت خروجی به صورتStream

 

اینکار را به چند روش می توانیم انجام دهیم در اینجا تابع getStreamFromURL را به صورت زیر تعریف می کنیم که از این تابع به راحتی می توانید در پروژه های خودتان استفاده کنید :

 


	InputStream getStreamFromURL(String urlString,String method){
		try {
			URL url=new URL(urlString);
			HttpURLConnection huc=(HttpURLConnection)url.openConnection();
			huc.setReadTimeout(10000);
			huc.setConnectTimeout(15000);
			huc.setRequestMethod(method);
			huc.setDoInput(true);
			
			huc.connect();
			
			return huc.getInputStream();
		} catch (Exception e) {
			return null;
		}
		
	}

تبدیل Stream به String :

 


	String streamToString(InputStream is){
		String result="";
		String line=null;
		BufferedReader br=new BufferedReader(new InputStreamReader(is));
		
		try {
			while((line=br.readLine())!=null){
				result+=line+"\n";
			}
		} catch (IOException e) {}
		
		return result;
	}

Parse کردن رشته JSON

 

در این برنامه می خواهیم به مقدار description از قسمت weather و مقدار speed از قسمت wind و مقدار humidity از قسمت main دسترسی پیدا کنیم. هر سه کلید main و wind و weather در داخل آبجکت اصلی قرار دارند برای دسترسی به مقادیر متناظر این کلید ها از getJSONObject استفاده می کنیم ، پس از به دست آوردن آبجکت مورد نظر از متد getString استفاده می کنیم و کلید را به آن ارسال می کنیم تا مقدار را به دست آوریم به رابطه قطعه کد زیر و عکس بعد از آن دقت کنید :

 


	void parseJSON(String JSONString){
		try {
			
			JSONObject jo=new JSONObject(JSONString);
			
			JSONArray weatherArray=jo.getJSONArray("weather");
			JSONObject firstWeatherArrayObject=weatherArray.getJSONObject(0);
			weatherResult=firstWeatherArrayObject.getString("description");
			
			JSONObject windObject=jo.getJSONObject("wind");
			windSpeedResult=windObject.getDouble("speed");
			
			JSONObject mainObject=jo.getJSONObject("main");
			humidityResult=mainObject.getInt("humidity");
			
		} catch (JSONException e) {}
	}

کل رشته JSON اصلی یک آبجکت است که در jo تعریف می شود.در مقابل کلید weather مقدار برابر آرایه است برای همین برای به دست آوردن این آرایه از فراخوانی getJSONArray روی jo استفاده می کنیم ، پس از به دست آوردن این آرایه اولین آبجکت این آرایه را با فرستادن 0 به getJSONObject بر روی weatherArray به دست می آوریم و آن را در firstWeatherArrayObject ذخیره می کنیم.

 

از متد getString برای دسترسی به مقادیری که از نوع رشته هستند استفاده می کنیم. از متد getDouble برای دسترسی به مقادیر از نوع اعداد اعشاری و از getInt برای دسترسی به مقادیر از نوع عدد صحیح استفاده می کنیم. کد فوق بسیار خواناست و نیازی به توضیح بیشتر نمی بینم.

 

در ادامه کار با یک برنامه اندروید ساده نحوه استفاده از JSON و ساخت یک برنامه هواشناسی بیشتر با مباحث توضیح داده شده آشنا می شویم.

برای شروع کار یک پروژه جدید ایجاد کنید

در داخل لایه اصلی برنامه  activity_main از کدهای زیر استفاده می کنیم.  


<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"
    android:padding="10dp"
    tools:context=".MainActivity" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:orientation="vertical" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >

            <TextView
                android:id="@+id/tvWeather"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Weather:" />

            <TextView
                android:id="@+id/tvWeatherValue"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="center" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >

            <TextView
                android:id="@+id/tvWindSpeed"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Wind Speed:" />

            <TextView
                android:id="@+id/tvWindSpeedValue"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="center" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >

            <TextView
                android:id="@+id/tvHumidity"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Humidity:" />

            <TextView
                android:id="@+id/tvHumidityValue"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="center" />
        </LinearLayout>
    </LinearLayout>

    <Button
        android:id="@+id/btnLoad"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:text="Load" />

</RelativeLayout

 

کد اصلی کلاس MainActivity.java


import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

import org.json.*;

import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.app.Activity;

public class MainActivity extends Activity {
	private String url1 = "http://api.openweathermap.org/data/2.5/weather?q=tehran"; 
	
	Button load;
	TextView weather,humidity,windSpeed;
	String weatherResult;
	double windSpeedResult;
	int humidityResult;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	
		load=(Button)findViewById(R.id.btnLoad);
		
		weather=(TextView)findViewById(R.id.tvWeatherValue);
		humidity=(TextView)findViewById(R.id.tvHumidityValue);
		windSpeed=(TextView)findViewById(R.id.tvWindSpeedValue);
		
		load.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				ReadJSON rj=new ReadJSON();
				rj.execute();
			}
		});
	
	}
	class ReadJSON extends AsyncTask<String, String, String> {
		 
           protected String doInBackground(String... args) {
        	InputStream jsonStream=getStreamFromURL(url1,"GET");
        	String jsonString=streamToString(jsonStream);
        	parseJSON(jsonString);
        	return null;
        }
        
        protected void onPostExecute(String file_url) {
        	weather.setText(weatherResult);
        	windSpeed.setText(""+windSpeedResult);
        	humidity.setText(""+humidityResult);
        }
 
    }
	
	void parseJSON(String JSONString){
		try {
			
			JSONObject jo=new JSONObject(JSONString);
			
			JSONArray weatherArray=jo.getJSONArray("weather");
			JSONObject firstWeatherArrayObject=weatherArray.getJSONObject(0);
			weatherResult=firstWeatherArrayObject.getString("description");
			
			JSONObject windObject=jo.getJSONObject("wind");
			windSpeedResult=windObject.getDouble("speed");
			
			JSONObject mainObject=jo.getJSONObject("main");
			humidityResult=mainObject.getInt("humidity");
			
		} catch (JSONException e) {}
	}
	InputStream getStreamFromURL(String urlString,String method){
		try {
			URL url=new URL(urlString);
			HttpURLConnection huc=(HttpURLConnection)url.openConnection();
			huc.setReadTimeout(10000);
			huc.setConnectTimeout(15000);
			huc.setRequestMethod(method);
			huc.setDoInput(true);
			
			huc.connect();
			
			return huc.getInputStream();
		} catch (Exception e) {
			return null;
		}
		
	}
	String streamToString(InputStream is){
		String result="";
		String line=null;
		
		try {
			BufferedReader br=new BufferedReader(new InputStreamReader(is));
			while((line=br.readLine())!=null){
				result+=line+"\n";
			}
		} catch (Exception e) {}
		
		return result;
	}
	
	
	
}

چون عمل خواندن JSON عملی زمان بر است نباید در Thread اصلی برنامه صورت گیرد برای همین زیر کلاسی از AsyncTask ایجاد کردم(با AsyncTask در این آموزش آشنا شدیم) و متد های گفته شده را در داخل doInBackground آن فراخوانی کردم. پس از اتمام کار نتیجه توسط متد onPostExecute به UI برنامه منتقل می شود. توجه کنید که همانطور که در آموزش های قبلی نیز اشاره کردم متد onPostExecute به UI-Thread دسترسی دارد و نیازی نداریم که در داخل آن از runOnUiThread استفاده کنیم.

و در آخر هم دسترسی اینترنت در فایل AndroidManifest  


	<uses-permission android:name="android.permission.INTERNET"/>

 

فایلهای ضمیمه
توجه! هیچ فایل ضمیمه ای برای این مطلب یافت نشد
درباره نویسنده
admin2
رضا نقی لو
androiddev160@gmail.com
نظرات شما
نظر جدید
    User name
    ناشناس
    1395/08/25 9:54 AM