پردازش Json با Gson
در سری آموزش های ارتباط با سرور تا به اینجا ارتباط با سرور را به طور کامل بررسی کردیم. اکنون باید اطلاعاتی که از سمت سرور دریافت میکنیم را پردازش کنیم. server عمدتا اطلاعات را در قالب JSon برای client ارسال میکند. روش های بسیار زیادی برای کار با Json در اندروید وجود دارد. ولی امروز میخواهیم با یکی از ابزار های بسیار کاربردی و سریع Json را پردازش کنیم. این آموزش میتواند برای تمام سطوح مبتدی تا پیشرفته قابل استفاده باشد. برای شروع ابتدا gson را به gradle اضافه میکنیم
compile 'com.google.code.gson:gson:2.8.0'
مهم ترین چیزی که Gson را نسبت به باقی ابزار تمایز میدهد این است که شما میتوانید مدل json را به طول کامل پیاده کنید و آنرا به Gson بدهید تا بطور دقیق بتوانید از آن استفاده کنید. فرض کنید پروژه ما شامل یک Slider و یک لیست داریم که هر آیتم آن یک لیست افقی هستند و هر لیست افقی شامل یک عکس و یک نام و یک امتیاز میباشد. ( مانند Play Store )
مدل Json آنرا میتوان به این صورت در نظر گرفت :
{ home: { slider: [ { title: "slider 1", image: "image_slider 1", id: 1 }, { title: "slider 2", image: "image_slider 2", id: 2 }, { title: "slider 3", image: "image_slider 3", id: 3 }, { title: "slider 4", image: "image_slider 4", id: 4 } ], home_list: [ { title: "Recommended", dataList: [ { image: "Image 1", id: 1, title: "Item 1", rank: 1 }, { image: "image 2", id: 2, title: "Item 2", rank: 2 }, { image: "Image 3", id: 3, title: "Item 3", rank: 3 }, { image: "Image 4", id: 4, title: "Item 4", rank: 4 } ] }, { title: "You may Like", dataList: [ { image: "Image 1", id: 1, title: "Item 1", rank: 1 }, { image: "Image 2", id: 2, title: "Item 2", rank: 2 }, { image: "Image 3", id: 3, title: "Item 3", rank: 3 }, { image: "Image 4", id: 4, title: "Item 4", rank: 4 } ] } ] } }
اکنون به پردازش این Json در برنامه میپردازیم. طبق آموزش های قبل ما برای استفاده از پاسخ server یک کلاس callback داریم که در متد onResult یک پارامتر Json Object را دارد. با توجه به این اطلاعات قبلی این آموزش را ادامه میدهیم. برای پیاده سازی Json بالا ابتدا باید قدم به قدم آنرا تحلیل کنیم و در این روش ما از پایین به بالا عمل میکنیم.
یک کلاس به نام Home Model نیاز داریم برای نگهداری اطلاعات هر یک از آیتم های لیست :
public class HomeModel implements Serializable { @SerializedName("title") private String itemTitle; @SerializedName("id") private String id; @SerializedName("image") private String image; @SerializedName("rank") private String rank; public String getTitle() { return itemTitle; } public String getId() { return id; } public String getImage() { return image; } public String getRank() { return rank; } }
در کلاس بالا از یک Annotation به نام SerializedName استفاده شده است و برای مشخص کردن آیتم درون Json می باشد. برای مثال
@SerializedName("title") private String itemTitle;
مقدار title را به متغیر itemTitle اختصاص میدهد.
کلاس بعدی را میتوان با عنوان Slide Model پیاده سازی کرد
public class SlideModel implements Serializable { @SerializedName("title") private String title; @SerializedName("image") private String image; @SerializedName("id") private String id; public String getTitle() { return title; } public String getImage() { return image; } public String getId() { return id; } }
کلاس Home Model ها به صورت آرایه ای در dataList نگهداری میشوند. dataList خود به همراه title در یک json object نگهداری میشوند.
پس مرحله بعدی ساختن کلاس مدلی برای آن می باشد. نام این کلاس را Home List Model قرار میدهیم :
public class HomeListModel implements Serializable { @SerializedName("title") private String title; @SerializedName("dataList") private ArrayList<HomeModel> homeModels; public String getTitle() { return title; } public ArrayList<HomeModel> getHomeModels() { return homeModels; } }
و همانطور که میبینید کاملا مشابه با ساختار json یک آرایه از Home Model در dataList قرار دارد.
یک مرحله بالاتر می آییم. در این مرحله یک آرایه از Home List Model ها و یک آرایه از Slide ها درون یک Json Object قرار گرفته اند. پس باید کلاس آن را نیز پیاده کنیم و نام آنرا Main Menu Model قرار میدهیم :
public class MainMenuModel implements Serializable { @SerializedName("slider") private ArrayList<SlideModel> slideModels; @SerializedName("home_list") private ArrayList<HomeListModel> homeListModels; public ArrayList<SlideModel> getSlideModels() { return slideModels; } public ArrayList<HomeListModel> getHomeListModels() { return homeListModels; } }
در مرحله آخر نیز Home درون یک json Object قرار گرفته است و برای آن نیز یک کلاس مینویسم و نام آنرا Main Menu Response قرار میدهیم :
public class MainMenuResponse implements Serializable { @SerializedName("home") private MainMenuModel mainMenuModel; public MainMenuModel getMainMenuModel() { return mainMenuModel; } }
با تحلیل کلاس ها میبینیم که کاملا رفتاری که json دارد را پیاده سازی کرده ایم . در واقع شما به ازای هر json Object به یک کلاس نیاز دارید تا آنرا نگهداری کند. هرچه درک قوی تری نسبت به json داشته باشید در پیاده سازی آن بوسیله Gson موفق تر خواهید بود.
حال به کلاس callback میرویم و چنین کدی را برای استفاده از json مینویسم :
class HomeCallBack extends ServerRequset { private HomeFragment fragment; HomeCallBack(HomeFragment fragment, String function, HashMap<String, String> params) { super(function, params); this.fragment = fragment; } @Override public void getResult(JSONObject object) { MainMenuResponse mainMenuResponse = new Gson().fromJson(object.toString(), MainMenuResponse.class); this.fragment.getListData(mainMenuResponse.getMainMenuModel().getHomeListModels(),mainMenuResponse.getMainMenuModel().getSlideModels()); } }
اکنون شما تمام اطلاعاتی که درون Json وجود دارد را به صورت ORM میتوانید استفاده کنید.
موفق باشید
دیدگاهتان را بنویسید
برای نوشتن دیدگاه باید وارد بشوید.