کتابخانه Gson یکی از دوست داشتنی ترین کتابخانه هاست که برای پروژه های اندروید مرتبط به سرور(تقریبا همه پروژه ها) بشدت لازمه چون با استفاده از Gson میتونیم خیلی راحت رشته جیسون دریافتی سرور رو به یک کلاس جاوا یا کاتلین و همچنین یک آرایه یا یک آبجکت رو به رشته جیسون تبدیل کنیم.
نکته مهم اینکه کتابخانه Gson مال خود Google هستش پس استفاده ازش خیلی لذت بخش تر خواهد بود ( یه غول تکنولوژی پشتشه 😀 )
خب قبل از اینکه بریم ادامه آموزش بهتره dependency یا وابستگی کتابخانه Gson رو به پروژه اضافه کنیم
implementation 'com.google.code.gson:gson:2.8.5'
جیسون هم مثل اکثر کتابخونه های مشابه با استفاده از annotation ها این تبدیل رو انجام میده.
همچنین بخوانید: آموزش Retrofit همراه با مثال
کمی بیشتر درباره تبدیل جیسون به آبجکت با کتابخانه Gson توضیح بدیم 🙂
برای تبدیل جیسون به یک کلاس خب مشخصا باید ابتدا یک کلاس جاوا یا کاتلین بسازیم که حاویه متغیرهایی برای نگهداریه داده های تبدیل شده توسط Gson خواهد بود که البته این تبدیل با کمک حاشیه نوشت ها یا annotation ها انجام خواهد شد که خود کتابخانه Gson در اختیار ما قرار خواهد داد.
قطعا برای درک بیشتر نیاز به مثال خواهد بود پس بریم واسه مثال 😉
تبدیل جیسون به آبجکت یا آرایه با استفاده از annotation زیر انجام میشه (درواقع کلیدی ترین annotation )
@SerializedName
که حاوی کلید جیسون خواهد بود.برای مثال اگر ما جیسون زیر رو از سرور بگیریم:
{"res":"this is result"
,"value":[
{"name":"ali","lname":"karimi"
,"age":"22","city":"tehran"},
{"name":"reza","lname":"karimi"
,"age":"22","city":"tehran"}
]
}
پس کلاسی که باید برای اون بسازیم بصورت زیر خواهد بود
جاوا
package dn.marjan.myprac;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
import java.util.List;
public class test {
@SerializedName("res")
@Expose
private String res;
@SerializedName("value")
@Expose
private List<Value> value = null;
public String getRes() {
return res;
}
public void setRes(String res) {
this.res = res;
}
public List<Value> getValue() {
return value;
}
public void setValue(List<Value> value) {
this.value = value;
}
public class Value {
@SerializedName("name")
private String name;
@SerializedName("lname")
private String lname;
@SerializedName("age")
private String age;
@SerializedName("city")
private String city;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLname() {
return lname;
}
public void setLname(String lname) {
this.lname = lname;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
}
}
کاتلین
class test {
@SerializedName("res")
var res: String? = null
@SerializedName("value")
var value: List<Value>? = null
inner class Value {
@SerializedName("name")
var name: String? = null
@SerializedName("lname")
var lname: String? = null
@SerializedName("age")
var age: String? = null
@SerializedName("city")
var city: String? = null
}
}
اینکه چطور قالب جیسون هارو به کلاس تبدیل کنم اصلا ترسناک نیست و ذهنتون سمت این نره که باید بشینید و دستی بنویسید فقط کافیه به سایت jsonschema2pojo.org یه سری بزنید و متن جیسونتون رو داخلش کپی کنید بعد تنظیماتی که میخواید رو انتخاب کنید و در نهایت دکمه Preview رو بزنید خواهید دید که کلاس جاواشو بهتون میده 🙂 اما بجز این کلاس پلاگین های مختلفی برای جاوا و کاتلینم هست:
پلاگین تبدیل جیسون به کلاس کاتلین:
پلاگین تبدیل جیسون به کلاس جاوا:
اگر هم بخواید میتونید این پلاگین هارو مستقیم از اندروید استودیو دانلود و نصب کنید فقط کافیه در اندروید استودیو به مسیر
File/Setting/plugins
برید و اسم پلاگین های بالا رو سرچ کنید و در نهایت هم install ، بعد از نصب اندروید استودیو پیشنهاد میده که خودشو ری استارت کنه که ترجیحا قبول کنید تا پلاگین بدرستی لود شه.
خب میتونیم بگیم عمده ترین دستورات کتابخانه Gson شامل دو مورد زیر میباشد:
toJson()
برای تبدیل به جیسون و
fromJson()
برای تبدیل به آبجکت یا آرایه
ما در ادامه دو متد رو بررسی خواهیم کرد که یکی برای تبدیل یک رشته جیسون به یک آبجکت از نوع یک کلاس مشخص و دیگری برای تبدیل یک رشته جیسون به یک آرایه است که به سادگی میتونید از این متدها در بخش های مختلف پروژتون استفاده کنید.
خب بریم سراغ متدهای تبدیل جیسون با کتابخانه Gson
متد زیر یک رشته جیسون رو میگیره و اون رو تبدیل به یک آبجکت از نوع کلاس User میکنه (توجه کنید که کلاس
User مثل توضیحات فوق با سایت jsonchema2pojo مطابق با نمونه جیسونی که میخوایم دریافت کنیم ساخته شده و دارای انوتیشن های SerializedName هستش)
جاوا
public User getUserJs(String value){
Gson gson = new Gson();
JsonReader reader = new JsonReader(new StringReader(value));
reader.setLenient(true);
User data = new User();
try{
data = gson.fromJson(value,User.class);
}catch (JsonSyntaxException e){
e.printStackTrace();
}
return data;
}
کاتلین
fun getUserJs(value: String) :User{
val gson = Gson()
val reader = JsonReader(StringReader(value))
reader.isLenient = true
var data = User()
try {
data = gson.fromJson<User>(reader, User::class.java)
}catch (e: JsonSyntaxException){
e.printStackTrace()
}
return data
}
اگر بخوایم کمی کد های فوق رو توضیح بدیم میتونیم اینطور بگیم که ابتدا یک آبجکت از نوع کلاس Gson ایجاد کردیم و همچنین یک آبجکت از JsonReader که میتونیم به وسیله این آبجکت یک سری پراپرتی زمان تبدیل اعمال کنیم که در این متد با Lenient رو فعال کردیم.این پراپرتی باعث میشه که از رشته ها ایراد نگیره و باعث کرش نشه.سپس با استفاده از fromJson ما مشخص کردیم که رشته جیسون باید درقالب چه کلاسی قرار بگیره (User)
خب حالا متد بعدی که جیسون رو تبدیل به آرایه میکنه
جاوا
public List<User> getUserListJs(String value) {
Gson gson = new Gson();
Type listType = new TypeToken<List<User>>() {
}.getType();
List<User> data = gson.fromJson(value, listType);
return data;
}
کاتلین
fun getDyDialogList(value: String) : List<DyDialog>{
val gson = Gson()
val listType = object : TypeToken<List<DyDialog>>() {}.type
var data = ArrayList<DyDialog>()
try {
data = gson.fromJson<List<DyDialog>>(value, listType) as ArrayList<DyDialog>
}catch (e: JsonSyntaxException){
e.printStackTrace()
}
return data
}
متد تبدیل جیسون به آرایه هم تقریبا شبیه به متد قبل هستش با تفاوت reader که در این متد باید از کلاس TypeToken برای شناساندن کلاس مدنظر استفاده کنیم.
همچنین بخوانید: کتابخانه Timber برای گرفتن لاگ بهتر در اندروید
امیدوارم آموزش کتابخانه Gson برای تبدیل جیسون در اندروید به شما کمک کرده باشد.