第04章:GSON

it2025-07-10  9

文章目录

Gson简介Gson处理对象的几个重要点 使用添加依赖基本类型 简单序列化简单反序列化复杂序列化复杂反序列化对象数组序列化对象数组反序列化对象集合序列化对相集合反序列化 补充全部代码


Gson简介

Gson是一个Java库,可以用来将Java对象转换成JSON字符串表示,或者将JSON字符串转换为等效的Java对象。

提供一种简单的、易于使用的机制实现Java对象与JSON字符串的转换。支持任意复杂的对象的表示。生成可读的JSON字符串输出。

Gson处理对象的几个重要点

推荐把成员变量都声明为private所有包含在当前类(包括父类)中的字段都默认被序列化或者反序列化如果某个字段被transient 、static关键词修饰,就不会被序列化或者反序列化

Gson无法提供JavaBean,需要手动去设置。

序列化:对象转字符串

使用

添加依赖

dependencies { …… //Gson implementation 'com.google.code.gson:gson:2.8.5' }

可以通过调用new Gson()来创建其对象。还有一个类GsonBuilder可用来创建一个Gson实例

基本类型
Serialization(序列化) Gson gson = new Gson(); 1. gson.toJson(1); ==> 1 2. gson.toJson("abcd"); ==> "abcd" 长度是6,包含引号 3. gson.toJson(new Long(10)); ==> 10 int[] values = { 1 }; 4. gson.toJson(values); ==> [1] ---------------------------------------------------------------- Deserialization(反序列化) 参数都是两个,第一个是目标,第二个是目的类型 int num1 = gson.fromJson("1", int.class); Integer num2 = gson.fromJson("1", Integer.class); Long num3 = gson.fromJson("1", Long.class); Boolean bool = gson.fromJson("false", Boolean.class); String str = gson.fromJson("\"abc\"", String.class); String[] str1=gson.fromJson("[\"abc\"]",String[].class); //字符串数组

简单序列化

Studnet是一个javaBean对象,属性为 name与num; 简单序列化 Studnet student=new Studnet(); student.setAge(20); student.setName("LiMing"); //序列化 String json=gson.toJson(student);

简单反序列化

String json=tv1.getText().toString(); Studnet student=gson.fromJson(json,Studnet.class);

复杂序列化

Teacher对象里包含Student属性,Student是另一个类 Studnet student=new Studnet(); student.setAge(20); student.setName("WangHong"); Teacher teacher=new Teacher(); teacher.setName("android"); teacher.setAge(3); teacher.setStudent(student); String json=gson.toJson(teacher);

复杂反序列化

String json=tv1.getText().toString(); Teacher teacher=gson.fromJson(json,Teacher.class);

对象数组序列化

Studnet stu1=new Studnet(); stu1.setName("name1"); stu1.setAge(20); Studnet stu2=new Studnet(); stu2.setName("name2"); stu2.setAge(40); Studnet[] list=new Studnet[2]; list[0]=stu1; list[1]=stu2; String str1=gson.toJson(list);

对象数组反序列化

String str1=tv1.getText().toString(); Studnet[] list=gson.fromJson(str1,Studnet[].class); str1=""; for(int i=0;i<list.length;++i){ String str2=list[i].toString(); str1+=str2; } str1就是String了;

对象集合序列化

List<Studnet> stus=new ArrayList<>(); Studnet stu1=new Studnet(); stu1.setName("name1"); stu1.setAge(101); Studnet stu2=new Studnet(); stu1.setName("name2"); stu1.setAge(102); stus.add(stu1); stus.add(stu2); //序列化 String str1=gson.toJson(stus);

对相集合反序列化

String json=tv1.getText().toString(); //1. 得到集合类型, //注意导包:import java.lang.reflect.Type;反射包 Type type=new TypeToken<List<Studnet>>(){}.getType();//匿名内部类,相当于创建了对象 //2. 反序列化 List<Studnet> stus=gson.fromJson(json,type);//List重写了toString方法 TypeToken •GSON 提供的用来捕获像List 这样的泛型信息的类 •Java编译器把捕获到的泛型信息编译到这个匿名内部类里,在运行时被getType() 方法用反射的API 提取到具体的类型信息

补充

我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过程,只要这个类实现了Serilizable接口,这个类的所有属性和方法都会自动序列化。 然而在实际开发过程中,我们常常会遇到这样的问题,这个类的有些属性需要序列化,而其他属性不需要被序列化,打个比方,如果一个用户有一些敏感信息(如密码,银行卡号等),为了安全起见,不希望在网络操作(主要涉及到序列化操作,本地序列化缓存也适用)中被传输,这些信息对应的变量就可以加上transient关键字。换句话说,这个字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化。实例在调用Json操作时不维护任何状态。因此,多个序列化和反序列化操作中可以使用相同的Gson对象。(不记录痕迹,可放心使用)。当序列化的时候,如果对象的某个字段为null,是不会输出到Json字符串中的。当反序列化的时候,某个字段在Json字符串中找不到对应的值,就会被赋值为null。

全部代码

------ MainActivity package com.example.a04gson; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; import com.example.a04gson.Beans.Studnet; import com.example.a04gson.Beans.Teacher; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.reflect.TypeToken; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Date; import java.util.List; public class MainActivity extends AppCompatActivity { private Button btn1; private Button btn2; private TextView tv1; private TextView tv2; //Gson gson = new Gson();无参数初始化 Gson gson=new GsonBuilder().//创建JsonBuilder对象 setPrettyPrinting().//格式化输出 serializeNulls().//允许输出null格式 setDateFormat("YY:MM:dd")//有参数初始化 Y年M月,日期格式化 .create();//创建Gson对象 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //获得控件对象 fun1(); btn1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { fun2();//简单序列化 //fun4();//复杂序列化 // fun6();//对象集合序列化 // fun8();//对象数组序列化 } }); btn2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { fun3();//简单反序列化 //fun5();//复杂反序列化 //fun7();//对象集合反序列化 //fun9();//对象数组反序列化 } });//简单反序列化 } public void fun1(){ tv1=findViewById(R.id.tv1); tv2=findViewById(R.id.tv2); btn1=findViewById(R.id.btn1); btn2=findViewById(R.id.btn2); } public void fun2(){ Log.e("111111111111","btn1执行"); Studnet student=new Studnet(); student.setAge(20); student.setName("LiMing"); student.setMima1("mima1message");//不展示 transient student.setMima2("mima2message");//不展示 static student.setBirthday(new Date()); //序列化 String json=gson.toJson(student); tv1.setText(json); } public void fun3(){ String json=tv1.getText().toString(); Studnet student=gson.fromJson(json,Studnet.class); tv2.setText(student.toString()); } public void fun4(){//Teacher>Studnent Studnet student=new Studnet(); student.setAge(20); student.setName("WangHong"); Teacher teacher=new Teacher(); teacher.setName("android"); teacher.setAge(3); teacher.setStudent(student); String json=gson.toJson(teacher); tv1.setText(json); } public void fun5(){ String json=tv1.getText().toString(); Teacher teacher=gson.fromJson(json,Teacher.class); tv2.setText(teacher.toString()); } public void fun6(){ List<Studnet> stus=new ArrayList<>(); Studnet stu1=new Studnet(); stu1.setName("name1"); stu1.setAge(101); Studnet stu2=new Studnet(); stu1.setName("name2"); stu1.setAge(102); stus.add(stu1); stus.add(stu2); //序列化 String str1=gson.toJson(stus); tv1.setText(str1); } public void fun7(){//JsonArray转集合 String json=tv1.getText().toString(); //1. 得到集合类型,*//import java.lang.reflect.Type;Tpye是反射包 Type type=new TypeToken<List<Studnet>>(){}.getType();//匿名内部类,相当于创建了对象 //2. 反序列化 List<Studnet> stus=gson.fromJson(json,type);//List重写了toString方法 tv2.setText(stus.toString()); } public void fun8(){ Studnet stu1=new Studnet(); stu1.setName("name1"); stu1.setAge(20); Studnet stu2=new Studnet(); stu2.setName("name2"); stu2.setAge(40); Studnet[] list=new Studnet[2]; list[0]=stu1; list[1]=stu2; String str1=gson.toJson(list); tv1.setText(str1); } public void fun9(){ String str1=tv1.getText().toString(); Studnet[] list=gson.fromJson(str1,Studnet[].class); str1=""; for(int i=0;i<list.length;++i){ String str2=list[i].toString(); str1+=str2; } tv2.setText(str1); } }//----------------------------------------------------------------------------------------------- --------Student类 package com.example.a04gson.Beans; import java.util.Date; public class Studnet { private String name; private int age; private transient String mima1; private static String mima2; private Date birthday;//util 包,util 包,util 包 @Override public String toString() { return "Studnet{" + "name='" + name + '\'' + ", age=" + age + ", mima1='" + mima1 + '\'' + "mima2='" + mima2 + '\'' + ", birthday=" + birthday + '}'; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getMima1() { return mima1; } public void setMima1(String mima1) { this.mima1 = mima1; } public static String getMima2() { return mima2; } public static void setMima2(String mima2) { Studnet.mima2 = mima2; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } ------------Text类 package com.example.a04gson.Beans; public class Text { private String name; private int num; @Override public String toString() { return "Text{" + "name='" + name + '\'' + ", num=" + num + '}'; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getNum() { return num; } public void setNum(int num) { this.num = num; } } -----------------Teacher类 package com.example.a04gson.Beans; public class Teacher { private String name; private int age; private Studnet student; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Studnet getStudent() { return student; } @Override public String toString() { return "Teacher{" + "name='" + name + '\'' + ", age=" + age + ", student=" + student + '}'; } public void setStudent(Studnet student) { this.student = student; } }
最新回复(0)